2011-11-09 41 views
0

这是(也许)一个已经问过的问题......但我有一些difficul来解决我的问题。 我需要转置为列的基于行的查询。 我解释一下: 这是我的实际查询结果Sql Server:如何转置行到列?

Year  Month  Value 
2010  Jan   19 
2010  Feb   10 
... 

我需要

Year  Jan  Feb   ...   Dec 
2010  19   20   ...   ... 
2011  11   ..   ...   

其实,我的主要查询是很简单..提前

SELECT  SUM(QTYCALC) AS TOT, YEAR(SCHEDSTART) AS MyYear, MONTH(SCHEDSTART) AS MyMonth 
FROM   PRODTABLE 
GROUP BY YEAR(SCHEDSTART), MONTH(SCHEDSTART) 

感谢

+0

其DB您使用的? – Yahia

+0

每个RDBMS都有不同的解决方案。请发布您使用的数据库品牌。 – danihp

+0

Sql Server 2008 – stighy

回答

1

您需要使用PIVOT来实现这一点 - 对于expl anation和一些例子看http://msdn.microsoft.com/en-us/library/ms177410.aspxhttp://www.simple-talk.com/community/blogs/andras/archive/2007/09/14/37265.aspx

另一种选择是:

SELECT 
YEAR(SCHEDSTART) AS MyYear, 
(SELECT SUM(X.QTYCALC) FROM PRODTABLE X WHERE MONTH(X.SCHEDSTART) = 1 AND YEAR(X.SCHEDSTART) = YEAR(P.SCHEDSTART)) AS Jan, 
(SELECT SUM(X.QTYCALC) FROM PRODTABLE X WHERE MONTH(X.SCHEDSTART) = 2 AND YEAR(X.SCHEDSTART) = YEAR(P.SCHEDSTART)) AS Feb, 
(SELECT SUM(X.QTYCALC) FROM PRODTABLE X WHERE MONTH(X.SCHEDSTART) = 3 AND YEAR(X.SCHEDSTART) = YEAR(P.SCHEDSTART)) AS Mar, 
(SELECT SUM(X.QTYCALC) FROM PRODTABLE X WHERE MONTH(X.SCHEDSTART) = 4 AND YEAR(X.SCHEDSTART) = YEAR(P.SCHEDSTART)) AS Apr, 
(SELECT SUM(X.QTYCALC) FROM PRODTABLE X WHERE MONTH(X.SCHEDSTART) = 5 AND YEAR(X.SCHEDSTART) = YEAR(P.SCHEDSTART)) AS May, 
(SELECT SUM(X.QTYCALC) FROM PRODTABLE X WHERE MONTH(X.SCHEDSTART) = 6 AND YEAR(X.SCHEDSTART) = YEAR(P.SCHEDSTART)) AS Jun, 
(SELECT SUM(X.QTYCALC) FROM PRODTABLE X WHERE MONTH(X.SCHEDSTART) = 7 AND YEAR(X.SCHEDSTART) = YEAR(P.SCHEDSTART)) AS Jul, 
(SELECT SUM(X.QTYCALC) FROM PRODTABLE X WHERE MONTH(X.SCHEDSTART) = 8 AND YEAR(X.SCHEDSTART) = YEAR(P.SCHEDSTART)) AS Aug, 
(SELECT SUM(X.QTYCALC) FROM PRODTABLE X WHERE MONTH(X.SCHEDSTART) = 9 AND YEAR(X.SCHEDSTART) = YEAR(P.SCHEDSTART)) AS Sep, 
(SELECT SUM(X.QTYCALC) FROM PRODTABLE X WHERE MONTH(X.SCHEDSTART) = 10 AND YEAR(X.SCHEDSTART) = YEAR(P.SCHEDSTART)) AS Oct, 
(SELECT SUM(X.QTYCALC) FROM PRODTABLE X WHERE MONTH(X.SCHEDSTART) = 11 AND YEAR(X.SCHEDSTART) = YEAR(P.SCHEDSTART)) AS Nov, 
(SELECT SUM(X.QTYCALC) FROM PRODTABLE X WHERE MONTH(X.SCHEDSTART) = 12 AND YEAR(X.SCHEDSTART) = YEAR(P.SCHEDSTART)) AS Dec 
FROM  PRODTABLE P 
GROUP BY YEAR(P.SCHEDSTART) 

您应该检查有关性能/执行计划两者(PIVOT这)...