【问题标题】:get count of data from previous 12 months start with sysdate从 sysdate 开始获取前 12 个月的数据计数
【发布时间】:2016-10-19 08:19:24
【问题描述】:

我有这样的场景:我的表有日期字段。像

id | date     |name |
1  |1/12/2012 |new  |
1  |1/12/2012 |renew  |
1  |1/09/2012 |new  |
1  |1/12/2012 |renew  |

我需要像 |

  name |Jan-12| Feb-12 | Mar-12| ....... |Dec-12|
   |new  |0     | 0      | ............... |1     |
   |renew|0     | 0      | ............... |2     |

如果我给出今天的日期,条件计数需要每月显示过去 12 个月。如果我输入今天,日期是动态的,日期输出将显示从 sysdate 开始的前 12 个月

请给我一些解决方案。

【问题讨论】:

  • 你试过了吗?
  • 它不起作用吗?
  • @notionquest 部分工作,但要求需要在条件('2015-10'、'2015-11'、'2015-12'、'2016-01'、' 2016-02','2016-03','2016-04','2016-05','2016-06''2016-07','2016-08','2016-09','2016-10 ')

标签: sql oracle datetime pivot


【解决方案1】:

您将获得显示为行(每个月一行)而不是列的结果。

Select to_char(YOUR_DATE, 'YYYY-MM'), count(id)
FROM table_name a
WHERE YOUR_DATE BETWEEN ADD_MONTHS(SYSDATE, -12) AND SYSDATE
GRoup by to_char(YOUR_DATE, 'YYYY-MM')
order by 1;

如下所示:-

2015-10 79
2015-11 223
2015-12 193
2016-01 182

使用 PIVOT:-

Select * FROM
(Select to_char(YOUR_DATE, 'YYYY-MM') AS "TDATE"
FROM table_name a
WHERE YOUR_DATE BETWEEN ADD_MONTHS(SYSDATE, -12) AND SYSDATE) 
PIVOT ( count (TDATE) for (TDATE) IN ('2015-10', '2015-11', '2015-12', '2016-01', '2016-02',
'2016-03','2016-04','2016-05','2016-06''2016-07','2016-08','2016-09', '2016-10'));  

请注意,IN 子句是强制性的,它需要出现在列标题中。

【讨论】:

    【解决方案2】:

    在日期上添加条件为“dateadd(mm,-12,@YourDate) 和@YourDate 之间的日期”

    【讨论】:

    • SELECT SUM(a.oct_count),SUM(a.sep_count) FROM (SELECT case DATEPART(month,sr.DocumentDate) WHEN 10 THEN (SELECT COUNT() from Table1 sr1 where DATEPART (month,sr1.DocumentDate) = 10 AND sr.ID = sr1.ID) END AS oct_count, case DATEPART(month,sr.DocumentDate) WHEN 9 THEN (SELECT COUNT() from Table1 sr1 where DATEPART(month ,sr1.DocumentDate) = 9 AND sr.ID = sr1.ID ) END AS sep_count from Table1 sr WHERE sr.DocumentDate BETWEEN DATEADD(mm,-2,GETDATE()) AND GETDATE()) a
    • 您可以在每个 CASE 语句中添加更多条件。希望对您有所帮助!
    【解决方案3】:

    You need to use PIVOT operator. PIVOT 运算符在单独的行中获取数据,将其聚合并根据您的情况将其转换为列。

    这是您可以用来将数据从行转换为列的查询..

    with test_tbl AS
    (
    select 1 id,  '01/12/2012' i_date, 'new' name from dual
    union all
    select 1 id,  '01/12/2012' i_date, 'renew' name from dual
    union all
    select 1 id,  '01/09/2012' i_date, 'new' name from dual
    union all
    select 1 id,  '01/12/2012' i_date, 'renew' name from dual
    )
    select * from 
    (select name, count(id) as count_id, extract(MONTH FROM to_date(i_date,'DD-MM-YYYY') ) as MONTH  from test_tbl group by name, extract(MONTH FROM to_date(i_date,'DD-MM-YYYY')))
    PIVOT ( count(count_id) count_id FOR  MONTH IN (9,12) );
    

    -----结果 ---------------

    NAME  9_COUNT_ID 12_COUNT_ID
    ----- ---------- -----------
    renew          0           1 
    new            1           1 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-12-19
      • 2014-05-05
      • 1970-01-01
      • 2019-05-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多