我正在研究我正在处理的销售仪表板的不同方面;
查询数据集中的相关项目如下:
Invoice Date
,Margin Amount
我想得到如下输出:
2012 2013
January $0 $0
February $0 $0
March $0 $0
April $0 $0
May $0 $0
June $0 $40
July $0 $40
August $0 $0
September $0 $0
October $0 $40
November $0 $0
December $0 $0
样本数据:(不包括不相关的字段)
Invoice Date Margin Amount
2013-06-27 40
2013-07-29 40
2013-10-30 40
我还列出了每月start date
和end date
的表格。字段如下;
Month Year Start_Date End_Date
January 2000 01/01/2000 31/01/2000
February 2000 01/02/2000 28/02/2000
一直到2016年12月,如果它有帮助...
我希望所有的保证金字段可以加在一起 - 当我说总结时,我的意思是1月份发生的所有交易都会加在一起(所以在输出表中,1月和2010年之下将是1月2010年的总保证金金额)。每笔交易都有保证金字段和日期。
非常感谢任何帮助。
答案 0 :(得分:0)
我认为以下是你所追求的。我使用了2011年到2015年。第一位假装输入表与一系列CTE。您将用实际数据替换它们。查询按月/年汇总边距,然后使用PIVOT查询将每年转换为水平列。
编辑:已编辑代码以使用SqlFiddle OP发布。
WITH
months AS (SELECT 1 AS mon UNION ALL SELECT mon + 1 FROM months WHERE mon < 12),
years AS (SELECT 2011 AS yr UNION ALL SELECT yr + 1 FROM years WHERE yr < 2015)
-- End data setup, real work begins here
SELECT * FROM
(
SELECT
months.mon, years.yr, COALESCE(SUM(inv.[Margin Amount]), 0) AS MarginAmount
FROM
months
CROSS JOIN years
LEFT OUTER JOIN All1 inv ON ( (YEAR(inv.[Invoice Date]) = years.yr) AND (MONTH(inv.[Invoice Date]) = months.mon) )
GROUP BY
months.mon, years.yr
) AS source
PIVOT
(
MAX(MarginAmount)
FOR yr in ([2011], [2012], [2013], [2014], [2015])
)
AS pvt
ORDER BY mon