日期:2014-05-18  浏览次数:20541 次

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 <> 0
union all
select 编码 , 颜色 , 数量 = m , 尺码 = 'M' from tb where m <> 0
union all
select 编码 , 颜色 , 数量 = l , 尺码 = 'L' from tb where l <> 0
union all
select 编码 , 颜色 , 数量 = xl , 尺码 = 'XL' from tb where xl <> 0
union all
select 编码 , 颜色 , 数量 = xxl , 尺码 = 'XXL' from tb where xxl <> 0
union all
select 编码 , 颜色 , 数量 = xxxl , 尺码 = 'XXXL' from tb where xxxl <> 0
union all
select 编码 , 颜色 , 数量 = xxxxl , 尺码 = 'XXXXL' from tb where xxxxl <> 0

------解决方案--------------------
SQL code

GO
IF OBJECT_ID('TBL')IS NOT NULL
DROP TABLE TBL
GO
CREATE TABLE TBL(
编码 VARCHAR(10),
名称 VARCHAR(10),
颜色 VARCHAR(10),
S INT ,
M INT ,
L INT,
XL INT ,
XXL INT 
)
GO
INSERT TBL
SELECT '100000','牛仔裤','蓝色',1,1,1,1,0 UNION ALL
SELECT '100001','衬衣','白色',1,0,0,0,1
select * from tbl

SELECT * FROM(
select  * from tbl 
unpivot ([数量] for [尺码] in([S],[M],[L],[XL],[XXL]))b)A
WHERE [数量]<>0
/*
编码    名称    颜色    数量    尺码
100000    牛仔裤    蓝色    1    S
100000    牛仔裤    蓝色    1    M
100000    牛仔裤    蓝色    1    L
100000    牛仔裤    蓝色    1    XL
100001    衬衣    白色    1    S
100001    衬衣    白色    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])) p
where 数量 > 0

------解决方案--------------------
如果你的数据库是2005及以上版本 试试这个 比较简洁
SQL code

select 编码, 名称, 颜色, 数量, 尺码
from tb unpivot(数量 for 尺码 in([S],[M],[L],[XL],[XXL],[XXXL],[XXXXL])) p
where 数量 > 0