Oracle SQL - 如何根据日期将计数计入ORACLE中的多个列

时间:2016-07-12 01:14:45

标签: sql oracle

我在Oracle表中有这样的数据

REGID SESSION_START_DATETIME USAGEID  
    1 7/11/2016                    1  
    1 6/10/2016                    1      
    1 6/09/2016                    1  
    1 5/04/2016                    1  
    1 5/04/2016                    1  
    1 5/04/2016                    1  

我需要像

这样的输出
REGID 0-30_days_usagecount 31-60_days_usagecount 61-90_days_usagecount  
    1                    1                     2                     3

usagecount基本上是count(usage_id)...如何为这个问题编写查询?

请帮忙

3 个答案:

答案 0 :(得分:1)

以下是使用PIVOT运算符执行此操作的方法。

with 
     inputs (REGID, SESSION_START_DATETIME, USAGEID) as (  
       select 1 , to_date('7/11/2016', 'mm/dd/yyyy'), 1 from dual union all 
       select 1 , to_date('6/10/2016', 'mm/dd/yyyy'), 1 from dual union all       
       select 1 , to_date('6/09/2016', 'mm/dd/yyyy'), 1 from dual union all 
       select 1 , to_date('5/04/2016', 'mm/dd/yyyy'), 1 from dual union all 
       select 1 , to_date('5/04/2016', 'mm/dd/yyyy'), 1 from dual union all 
       select 1 , to_date('5/04/2016', 'mm/dd/yyyy'), 1 from dual
     )
select * from (
  select regid, session_start_datetime,
         case when trunc(sysdate) - session_start_datetime between  0 and 30
                   then  '0-30_days_usagecount'
              when trunc(sysdate) - session_start_datetime between 31 and 60
                   then '31-60_days_usagecount'
              when trunc(sysdate) - session_start_datetime between 61 and 90
                   then '61-90_days_usagecount'
              end
         as col
  from inputs
)
pivot (  count(session_start_datetime)
            for col in ( '0-30_days_usagecount', '31-60_days_usagecount',
                        '61-90_days_usagecount'
                       )
      )
;



     REGID '0-30_days_usagecount' '31-60_days_usagecount' '61-90_days_usagecount'
---------- ---------------------- ----------------------- -----------------------
         1                      1                       2                       3

1 row selected.

答案 1 :(得分:0)

SELECT regid,
  SUM(
  CASE
    WHEN session_start_dt <= (sysdate - 30)
    THEN usage_id
    ELSE 0
  END) T1,
  SUM(
  CASE
    WHEN session_start_dt   > (sysdate - 30)
    AND session_start_date <= (sysdate -60)
    THEN usage_id
    ELSE 0
  END) T2,
  SUM(
  CASE
    WHEN session_start_dt   > (sysdate - 60)
    AND session_start_date <= (sysdate -90)
    THEN usage_id
    ELSE 0
  END) T3
FROM temp
GROUP BY regid;

答案 2 :(得分:-1)

试试这个

SELECT *