SELECT SalesPersonID, SUM(CASEDATEPART(MM,OrderDate)WHEN1THEN1ELSE0END) AS JAN, SUM(CASEDATEPART(MM,OrderDate)WHEN2THEN1ELSE0END) AS FEB, SUM(CASEDATEPART(MM,OrderDate)WHEN3THEN1ELSE0END) AS MAR, SUM(CASEDATEPART(MM,OrderDate)WHEN4THEN1ELSE0END) AS APR FROM Sales.SalesOrderHeader WHEREDATEPART(yyyy,OrderDate) =2002 GROUPBY SalesPersonID
PIVOT(COUNT(MON)是我们需要统计的数据,FOR MON IN([1],[2],[3],[4]是统计的范围)就成了我们最终输出的结构了。 PIVOT,可以不能一下明白它的实现,但是只要你是使用了一两次,相信就会很容易地掌握它。与PIVOT对应的还以一个操作符UNPIVOT,它完成PIVOT的逆操作,在这里就不介绍了,如果有兴趣的话,可以参考SQL Server Books Online。
SELECT SalesPersonID, [1]AS JAN,[2]AS FEB, [3]AS MAR, [4]AS APR FROM ( SELECT SalesPersonID, DATEPART(MM,OrderDate) AS MON FROM Sales.SalesOrderHeader WHEREDATEPART(yyyy,OrderDate) =2002 ) S PIVOT ( COUNT(MON) FOR MON IN ([1],[2],[3],[4]) ) AS P
在上面的例子中,同过下面的
SELECT SalesPersonID, DATEPART(MM,OrderDate) AS MON FROM Sales.SalesOrderHeader WHEREDATEPART(yyyy,OrderDate) =2002