从具有不同WHERE条件

时间:2016-04-12 09:33:30

标签: sql oracle

我有两个select语句,我想生成两列,每个语句并排使用这两个select语句中的两个select语句

查询1

 SELECT DISTINCT CASE_ID 
 from t1 
 WHERE MODIFIED_DATE BETWEEN TO_DATE('{RUN_DATE_YYYYMMDD}','YYYYMMDD')-56 
                       AND TO_DATE('{RUN_DATE_YYYYMMDD}','YYYYMMDD')-49 
CASE_ID
12
13
14
15
17

查询2

SELECT DISTINCT CASE_ID
from t1 
WHERE MODIFIED_DATE BETWEEN TO_DATE('{RUN_DATE_YYYYMMDD}','YYYYMMDD')-49 
                      AND TO_DATE('{RUN_DATE_YYYYMMDD}','YYYYMMDD')-42
CASE_ID
45
98
67
90
76
82
61

最终输出应该是这样的:

C1   C2
12   45
13   98
14   67
15   90
17   76
     82
     61

有谁能告诉我该怎么办?

谢谢。

更新

我从答案中尝试了一个查询:

SELECT DISTINCT 
             case when 
                MODIFIED_DATE BETWEEN TO_DATE('{RUN_DATE_YYYYMMDD}','YYYYMMDD') - 56 
                                  AND TO_DATE('{RUN_DATE_YYYYMMDD}','YYYYMMDD') - 49
               then CASE_ID 
             end as c1,
        DISTINCT 
               case when 
                  MODIFIED_DATE BETWEEN TO_DATE('{RUN_DATE_YYYYMMDD}','YYYYMMDD')-49  
                                    AND TO_DATE('{RUN_DATE_YYYYMMDD}','YYYYMMDD')-42 
                  then CASE_ID 
               end as c2
from t1 
WHERE MODIFIED_DATE 
         BETWEEN TO_DATE('{RUN_DATE_YYYYMMDD}','YYYYMMDD') - 56 
             AND TO_DATE('{RUN_DATE_YYYYMMDD}','YYYYMMDD') - 42

我得到了ORA-00936:缺少表情。谁能告诉我这个问题?

感谢。

3 个答案:

答案 0 :(得分:1)

您正在寻找过滤后的聚合:

SELECT COUNT(DISTINCT 
             case when 
                MODIFIED_DATE BETWEEN TO_DATE('{RUN_DATE_YYYYMMDD}','YYYYMMDD') - 56 
                                  AND TO_DATE('{RUN_DATE_YYYYMMDD}','YYYYMMDD') - 49
               then CASE_ID 
             end) as c1,
        COUNT(DISTINCT 
               case when 
                  MODIFIED_DATE BETWEEN TO_DATE('{RUN_DATE_YYYYMMDD}','YYYYMMDD')-49  
                                    AND TO_DATE('{RUN_DATE_YYYYMMDD}','YYYYMMDD')-42 
                  then CASE_ID 
               end) as c2
from t1 
WHERE MODIFIED_DATE 
         BETWEEN TO_DATE('{RUN_DATE_YYYYMMDD}','YYYYMMDD') - 56 
             AND TO_DATE('{RUN_DATE_YYYYMMDD}','YYYYMMDD') - 42 

请注意,WHERE子句现在需要涵盖两个时间间隔。

答案 1 :(得分:0)

如果col1col2之间没有任何关系,但您只想并排显示它们,则可以执行以下操作:

SELECT COUNT(DISTINCT CASE_ID) ,NULL 
  from t1 
  AND MODIFIED_DATE BETWEEN TO_DATE('{RUN_DATE_YYYYMMDD}','YYYYMMDD')-56 
                   AND TO_DATE('{RUN_DATE_YYYYMMDD}','YYYYMMDD')-49 
 union
 SELECT NULL, COUNT(DISTINCT CASE_ID) 
 from t1 
 AND MODIFIED_DATE BETWEEN TO_DATE('{RUN_DATE_YYYYMMDD}','YYYYMMDD')-49 
                  AND TO_DATE('{RUN_DATE_YYYYMMDD}','YYYYMMDD')-42

输出看起来像是:

  C1   C2  
  12   NULL
  13   NULL
  .    NULL
  .    NULL
  NULL  45
  NULL  98
  NULL   .
  NULL   .

答案 2 :(得分:0)

这对你有用吗?

  with w_q1 as (
           select case_id, row_number() over (order by modified_date) rid
              from (
                 SELECT DISTINCT CASE_ID
                    from t1 
                 WHERE MODIFIED_DATE 
                    BETWEEN TO_DATE('{RUN_DATE_YYYYMMDD}','YYYYMMDD') - 56 
                       AND TO_DATE('{RUN_DATE_YYYYMMDD}','YYYYMMDD') - 49
                 )
           ),
     w_q2 as (
           select case_id, row_number() over (order by modified_date) rid
              from (
                 SELECT DISTINCT CASE_ID
                    from t1 
                 WHERE MODIFIED_DATE 
                    BETWEEN TO_DATE('{RUN_DATE_YYYYMMDD}','YYYYMMDD') - 49
                       AND TO_DATE('{RUN_DATE_YYYYMMDD}','YYYYMMDD') - 42
                   )
           )
  select w_q1.case_id, w_q2.case_id
    from w_q1
     full outer join w_q2
       on w_q1.rid = w_q2.rid
  /

它只需要你的两个“单独”结果,为它们分配一种“行ID”,并使用它来加入它们......使用完整的外部连接以确保没有任何内容被切断。