0

我需要有 2 列的结果。1 个源表/视图有一个名为“Date_Entered”的字段,它是每个条目的 yyyy-mm-dd hh.mm.ss(完整日期/时间戳)我需要一个构建 2 列结果的查询。结果是每年每月的记录总数。看起来像这样...

Year_2012 ..... Year_2013
498 .................. 132
134 ................ . 564
787 ................. 342

依此类推,每年有 12 个结果(如果适用)到目前为止我所拥有的是这个.. 它包含 12 个记录的第一列(每月 1 个)以及每个月内的总行数。

SELECT  COUNT(DATEPART(mm, Date_Entered)) AS Year_2012
FROM    cwwebapp_oti.dbo.v_cbi_All_Tickets
WHERE   (Company_Name IN ('Company, Inc.', 'Business LLC')) AND 
        (DATEPART(yyyy, Date_Entered) = '2012')
GROUP BY DATEPART(mm, Date_Entered)
ORDER BY DATEPART(mm, Date_Entered)

Year_2012
518
452
593
810
etc...

我已经研究过,但没有找到如何从同一数据源构建第二列,但Year_2013当然只显示其中有 5 行。

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

〜库格

4

1 回答 1

0

这是一个可能的解决方案。它是有限的,因为它仅适用于 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

list_of_months子查询仅用于获取 2012 年 1 月到 2013 年 12 月之间的月份列表。这可以是任何表,唯一的要求是它包含的行数与您需要报告的月份数一样多在这种情况下,我们假设该表至少有 24 行。

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

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

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
于 2013-05-16T19:50:05.317 回答