QL - 按销售月份对销售数据进行分组 - SQL Server 2008

时间:2013-11-27 04:16:39

标签: sql sql-server sql-server-2008

我正在研究我正在处理的销售仪表板的不同方面;

查询数据集中的相关项目如下:

Invoice DateMargin 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 dateend 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年的总保证金金额)。每笔交易都有保证金字段和日期。

非常感谢任何帮助。

1 个答案:

答案 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