在sql server查询中需要每月报告

时间:2014-05-13 05:24:38

标签: sql sql-server

我有两张桌子(Product1product2)。

Product1                                            Product2
------------------------------            -------------------------------------
PID    ProdDesc    ProdCode                              Date        PID
------------------------------            -------------------------------------
1      Sony         s001                              2013/01/21      1
2      Samsung      sa01                              2013/02/27      1
3      LG           L001                              2013/03/14      2
4      Toshiba      T001                              2013/04/18      3
5      Philips      P001                              2013/05/30      4
                                                      2013/06/12      5 

我需要生成一个查询,该查询连接来自2个表的数据,并按月对结果进行分组。

这是我想要的输出:

ProdDesc    Jan2013 Feb2013  Mar2013   Apr2013   May2013  Jun2013  Jul2013  Aug2013  Sep2013  Oct2013  Nov2013  Dec2013
--------------------------------------------------------------------------------------------------
Sony           1      1        0          0         0       0        0        0        0    
Samsung        0      0        1          0         0       0        0        0        0    
LG             0      0        0          1         0       0        0        0        0    
Toshiba        0      0        0          0         1       0        0        0        0    
Philips        0      0        0          0         0       1        0        0        0 

1 个答案:

答案 0 :(得分:1)

您需要使用PIVOT将结果投影到列中,但需要先预先准备数据,以便每月生成列名和组数据:

SELECT ProdDesc, [Jan2013],[Feb2013],[Mar2013],[Apr2013],
                 [May2013],[Jun2013]
FROM 
(   
  SELECT ProdDesc, YearMonth, COUNT(P2PID) AS ProdCount
  FROM
  (
    SELECT p1.ProdDesc, 
      CAST(DATENAME(MONTH, [DATE]) AS VARCHAR(3)) + 
      DATENAME(YEAR, [DATE]) AS YearMonth, 
      p2.PID as P2PID
    FROM Product1 p1
    LEFT JOIN Product2 p2
    ON p1.PID = p2.PID
  ) x
  GROUP BY ProdDesc, YearMonth
) y
PIVOT
(
  SUM(ProdCount)
  for [YearMonth] IN ([Jan2013],[Feb2013],[Mar2013],
                      [Apr2013],[May2013],[Jun2013])
) pv;

SqlFiddle here

您很可能想要动态确定列(MonYYYY)。看看here如何做到这一点。

如有必要,您可以使用ISNULLCOALESCE替换输出中的NULLS ISNULL([Jan2013], 0) AS Jan2013