我需要有2列结果。 1源表/视图有一个名为“Date_Entered”的字段,每个条目的yyyy-mm-dd hh.mm.ss(完整日期/时间戳)我需要一个构建2列结果的查询。
结果是每年每月的记录总数。看起来像这样......
Year_2012 ..... Year_2013
498 ................. 132
134 ................. 564
787 ................. 342
依此类推,每年12个结果(如果适用)到目前为止,我的目的是这个...它将12个recods的第一列(每月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行。
提前感谢您提供的任何帮助!
〜Coog
答案 0 :(得分: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上做了一些Google-ing,我认为以下查询应该有效。同样,我确信更熟悉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