读书人

SQL行转列的有关问题(应该是这样说吧

发布时间: 2012-04-23 13:17:38 作者: rapoo

SQL行转列的问题(应该是这样说吧?)


如图所示:源数据如上面的,
目标像下面的(列数据为零的忽略)。
不知这样叫不叫行转列呢?
谢谢。


[解决办法]

探讨

应该是叫行转列,即如源数据中,每一个SIZE数量都为1,(有2条数据,即想求得的结果就是14条)
如下所示:
编码 名称 颜色 数量 尺码
100000牛仔裤蓝色1 S
100000牛仔裤蓝色1 M
100000牛仔裤蓝色1 L
100000牛仔裤蓝色1 XL
......

[解决办法]
SQL code
select 编码 , 颜色 , 数量 = s , 尺码 = 'S' from tb where s <> 0union allselect 编码 , 颜色 , 数量 = m , 尺码 = 'M' from tb where m <> 0union allselect 编码 , 颜色 , 数量 = l , 尺码 = 'L' from tb where l <> 0union allselect 编码 , 颜色 , 数量 = xl , 尺码 = 'XL' from tb where xl <> 0union allselect 编码 , 颜色 , 数量 = xxl , 尺码 = 'XXL' from tb where xxl <> 0union allselect 编码 , 颜色 , 数量 = xxxl , 尺码 = 'XXXL' from tb where xxxl <> 0union allselect 编码 , 颜色 , 数量 = xxxxl , 尺码 = 'XXXXL' from tb where xxxxl <> 0
[解决办法]
SQL code
GOIF OBJECT_ID('TBL')IS NOT NULLDROP TABLE TBLGOCREATE TABLE TBL(编码 VARCHAR(10),名称 VARCHAR(10),颜色 VARCHAR(10),S INT ,M INT ,L INT,XL INT ,XXL INT )GOINSERT TBLSELECT '100000','牛仔裤','蓝色',1,1,1,1,0 UNION ALLSELECT '100001','衬衣','白色',1,0,0,0,1select * from tblSELECT * FROM(select  * from tbl unpivot ([数量] for [尺码] in([S],[M],[L],[XL],[XXL]))b)AWHERE [数量]<>0/*编码    名称    颜色    数量    尺码100000    牛仔裤    蓝色    1    S100000    牛仔裤    蓝色    1    M100000    牛仔裤    蓝色    1    L100000    牛仔裤    蓝色    1    XL100001    衬衣    白色    1    S100001    衬衣    白色    1    XXL*/--2005以上版本使用unpivot很简单
[解决办法]
select 编码,名称,颜色,sum(数量),尺码 from t1 where s is not null
UNION all
select 编码,名称,颜色,sum(数量),尺码 from t1 where m is not null
UNION all
select 编码,名称,颜色,sum(数量),尺码 from t1 where l is not null
UNION all
select 编码,名称,颜色,sum(数量),尺码 from t1 where xl is not null
UNION all
select 编码,名称,颜色,sum(数量),尺码 from t1 where xxl is not null
UNION all
select 编码,名称,颜色,sum(数量),尺码 from t1 where xxxl is not null
UNION all
select 编码,名称,颜色,sum(数量),尺码 from t1 where xxxxl is not null
[解决办法]
如果你的数据库是2005及以上版本 试试这个
SQL code
select 编码, 名称, 颜色, 数量, 尺码from tb unpivot(数量 for 尺码 in([S],[M],[L],[XL],[XXL],[XXXL],[XXXXL])) pwhere 数量 > 0
[解决办法]
如果你的数据库是2005及以上版本 试试这个 比较简洁
SQL code
select 编码, 名称, 颜色, 数量, 尺码from tb unpivot(数量 for 尺码 in([S],[M],[L],[XL],[XXL],[XXXL],[XXXXL])) pwhere 数量 > 0 

读书人网 >SQL Server

热点推荐