
如上图:
同一个内容,对两个不同列进行行转列,第一次转正常,第二次转变两行。对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