Select 两次清点记录

Select 两次清点记录,select,count,datepart,Select,Count,Datepart,我需要有一个结果2列。1源表/视图中有一个名为Date_Entered的字段,该字段为yyyy-mm-dd hh.mm.ss。对于每个条目完整的日期/时间戳,我需要一个生成两列结果的查询。 结果是每年每月记录的总数。看起来像这样。。。 2012年。。。。。2013年上半年 498................. 132 134................. 564 787................. 342 以此类推,每年12个结果,如

我需要有一个结果2列。1源表/视图中有一个名为Date_Entered的字段,该字段为yyyy-mm-dd hh.mm.ss。对于每个条目完整的日期/时间戳,我需要一个生成两列结果的查询。 结果是每年每月记录的总数。看起来像这样。。。 2012年。。。。。2013年上半年 498................. 132 134................. 564 787................. 342

以此类推,每年12个结果,如果适用的话,到目前为止我得到的是。。它将第一列12个记录(每月1个)与每个月内的总行数相结合

我已经研究过了,没有发现如何从相同的数据源获得第二列构建,但只显示了2013年,其中到目前为止有5行

提前感谢您提供的任何帮助


~Coog

这里有一个可能的解决方案。它是有限的,因为它只适用于2012年和2013年,如果您想包括其他年份,则需要修改。它也不是很优雅,我相信这个站点上的一些SQL专家将能够简化它

SELECT NVL(SUM(DECODE(date_entered_year, '2012', 1, 0)), 0) year_2012,
       NVL(SUM(DECODE(date_entered_year, '2013', 1, 0)), 0) year_2013
  FROM (SELECT TO_CHAR(date_entered, 'YYYY-MM') date_entered_month,
               TO_CHAR(date_entered, 'YYYY')    date_entered_year
          FROM cwwebapp_oti.dbo.v_cbi_All_Tickets
         WHERE company_name IN ('Company, Inc.', 'Business LLC')
       ),
       (SELECT TO_CHAR(ADD_MONTHS(TO_DATE('2012-01','yyyy-mm'), rownum -1), 'YYYY-MM') year_month,
               TO_CHAR(ADD_MONTHS(TO_DATE('2012-01','yyyy-mm'), rownum -1), 'MM') month
          FROM cwwebapp_oti.dbo.v_cbi_All_Tickets
         WHERE ROWNUM <= MONTHS_BETWEEN(TO_DATE('2013-12','yyyy-mm'),
                                        TO_DATE('2012-01','yyyy-mm'))+1
       ) list_of_months
 WHERE year_month = date_entered_month
 GROUP BY month
 ORDER BY month
SELECT SUM(CASE date_entered_year
             WHEN '2012' THEN 1
             ELSE 0
           END) year_2012,
       SUM(CASE date_entered_year
             WHEN '2013' THEN 1
             ELSE 0
           END) year_2013
  FROM (SELECT CAST(DATEPART(year, DATEADD(mm,rn-1, CONVERT(date, '20120101'))) AS VARCHAR)+'-'+
                CAST(DATEPART(month, DATEADD(mm,rn-1, CONVERT(date, '20120101'))) AS VARCHAR) y1,
               CAST(DATEPART(month, DATEADD(mm,rn-1, CONVERT(date, '20120101'))) AS VARCHAR) m1
          FROM (SELECT row_number() OVER (ORDER BY id) as rn
                  FROM cwwebapp_oti.dbo.v_cbi_All_Tickets) sub1
         WHERE rn <= DATEDIFF(mm, CONVERT(date, '20120101'), 
                                  CONVERT(date, '20131231'))+1
       ) list_of_months LEFT OUTER JOIN 
       (SELECT CAST(DATEPART(year, date_entered) AS VARCHAR)+'-'+
                CAST(DATEPART(month, date_entered) AS VARCHAR) date_entered_month,
               CAST(DATEPART(year, date_entered) AS VARCHAR) date_entered_year
          FROM cwwebapp_oti.dbo.v_cbi_All_Tickets
         WHERE company_name IN ('Company, Inc.', 'Business LLC')
       ) company_data ON list_of_months.y1 = company_data.date_entered_month
 GROUP BY m1
 ORDER BY m1
“月列表”子查询仅用于获取2012年1月至2013年12月之间的月列表。这可以是任何一个表,唯一的要求是它包含的行数与您报告所需的行数相同。在这种情况下,我们假设该表至少有24行

另外,我有Oracle的背景,看起来您处于SQL Server环境中,因此需要将Oracle函数转换为SQL函数。我希望这有帮助

更新 我在SQLServer上做了一点谷歌搜索,我认为下面的查询应该可以工作。同样,我相信更精通SQL Server的人将能够简化它

SELECT NVL(SUM(DECODE(date_entered_year, '2012', 1, 0)), 0) year_2012,
       NVL(SUM(DECODE(date_entered_year, '2013', 1, 0)), 0) year_2013
  FROM (SELECT TO_CHAR(date_entered, 'YYYY-MM') date_entered_month,
               TO_CHAR(date_entered, 'YYYY')    date_entered_year
          FROM cwwebapp_oti.dbo.v_cbi_All_Tickets
         WHERE company_name IN ('Company, Inc.', 'Business LLC')
       ),
       (SELECT TO_CHAR(ADD_MONTHS(TO_DATE('2012-01','yyyy-mm'), rownum -1), 'YYYY-MM') year_month,
               TO_CHAR(ADD_MONTHS(TO_DATE('2012-01','yyyy-mm'), rownum -1), 'MM') month
          FROM cwwebapp_oti.dbo.v_cbi_All_Tickets
         WHERE ROWNUM <= MONTHS_BETWEEN(TO_DATE('2013-12','yyyy-mm'),
                                        TO_DATE('2012-01','yyyy-mm'))+1
       ) list_of_months
 WHERE year_month = date_entered_month
 GROUP BY month
 ORDER BY month
SELECT SUM(CASE date_entered_year
             WHEN '2012' THEN 1
             ELSE 0
           END) year_2012,
       SUM(CASE date_entered_year
             WHEN '2013' THEN 1
             ELSE 0
           END) year_2013
  FROM (SELECT CAST(DATEPART(year, DATEADD(mm,rn-1, CONVERT(date, '20120101'))) AS VARCHAR)+'-'+
                CAST(DATEPART(month, DATEADD(mm,rn-1, CONVERT(date, '20120101'))) AS VARCHAR) y1,
               CAST(DATEPART(month, DATEADD(mm,rn-1, CONVERT(date, '20120101'))) AS VARCHAR) m1
          FROM (SELECT row_number() OVER (ORDER BY id) as rn
                  FROM cwwebapp_oti.dbo.v_cbi_All_Tickets) sub1
         WHERE rn <= DATEDIFF(mm, CONVERT(date, '20120101'), 
                                  CONVERT(date, '20131231'))+1
       ) list_of_months LEFT OUTER JOIN 
       (SELECT CAST(DATEPART(year, date_entered) AS VARCHAR)+'-'+
                CAST(DATEPART(month, date_entered) AS VARCHAR) date_entered_month,
               CAST(DATEPART(year, date_entered) AS VARCHAR) date_entered_year
          FROM cwwebapp_oti.dbo.v_cbi_All_Tickets
         WHERE company_name IN ('Company, Inc.', 'Business LLC')
       ) company_data ON list_of_months.y1 = company_data.date_entered_month
 GROUP BY m1
 ORDER BY m1

我在MS SQL server环境中,准确地说,我在Visual Studio 2012中使用查询生成器获取图表对象的数据。我测试了你的代码,当然它不会与Oracle函数一起工作,所以它失败了,但是!!!我想说谢谢你,因为它为解决问题奠定了基础!!!谢谢