当前位置: 代码迷 >> Sql Server >> MS SqlServer 2008关于PIVOT的疑点
  详细解决方案

MS SqlServer 2008关于PIVOT的疑点

热度:23   发布时间:2016-04-24 09:12:03.0
MS SqlServer 2008关于PIVOT的疑问

如上图:
同一个内容,对两个不同列进行行转列,第一次转正常,第二次转变两行。对MS Sql不是很精通,忘各位指点。测试代码如下:
DECLARE @Table TABLE(
Id  CHAR(1),
Item  INT,
NumMax  INT,
NumNow  INT
)
INSERT INTO @Table
SELECT '1',1,5,0
INSERT INTO @Table
SELECT '1',2,0,0
INSERT INTO @Table
SELECT '1',3,0,0
INSERT INTO @Table
SELECT '1',4,0,0
SELECT Id,[1],[2],[3],[4] FROM @Table PIVOT(SUM(NumMax) FOR Item IN([1],[2],[3],[4]))A
SELECT Id,[1],[2],[3],[4] FROM @Table PIVOT(SUM(NumNow) FOR Item IN([1],[2],[3],[4]))B

------解决思路----------------------
SELECT Id,[1],[2],[3],[4] FROM (select id,item,numnow from @Table )t  PIVOT(SUM(NumNow) FOR Item IN([1],[2],[3],[4]))B

这样

第一个OK是因为你的NUMNOW全一样的。
------解决思路----------------------
SELECT * FROM @Table PIVOT(SUM(NumMax) FOR Item IN([1],[2],[3],[4]))A
SELECT * FROM @Table PIVOT(SUM(NumNow) FOR Item IN([1],[2],[3],[4]))B

Id        NumNow           1           2           3           4
---- ----------- ----------- ----------- ----------- -----------
1              0           5           0           0           0


Id        NumMax           1           2           3           4
---- ----------- ----------- ----------- ----------- -----------
1              0        NULL           0           0           0
1              5           0        NULL        NULL        NULL

这样就看就清楚了。除了参与SUM()的统计字段、FOR后面的分列字段,剩下的字段存在几种组合就分几行。

如果你只需要用Id分行,要用子查询先过滤字段:
SELECT *
  FROM (SELECT Id,Item,NumMax FROM @Table) t
 PIVOT (SUM(NumMax) FOR Item IN([1],[2],[3],[4]))A

SELECT *
  FROM (SELECT Id,Item,NumNow FROM @Table) t
 PIVOT (SUM(NumNow) FOR Item IN([1],[2],[3],[4]))A

Id             1           2           3           4
---- ----------- ----------- ----------- -----------
1              5           0           0           0


Id             1           2           3           4
---- ----------- ----------- ----------- -----------
1              0           0           0           0
  相关解决方案