如果danhao为null的话,也要显示出来,显示出的leibie顺序一定要按编号顺序由左到右从小到大排列
temp1表
bh leibie danwei ypid shuliang riqi danhao
010201 铁板0.8 NULL NULL .0000 NULL NULL
010202 铁板1.4 NULL NULL .0000 NULL NULL
010203 大边框 NULL NULL .0000 NULL NULL
010204 暗插销 NULL NULL .0000 NULL NULL
010205 粉末 NULL NULL .0000 NULL NULL
010206 合页 NULL NULL .0000 NULL NULL
010207 背板 NULL NULL .0000 NULL NULL
010208 防火锁 NULL NULL .0000 NULL NULL
010209 闭门器 NULL NULL .0000 NULL NULL
010210 管井锁 NULL NULL .0000 NULL NULL
010211 防盗锁 NULL NULL .0000 NULL NULL
010212 明插 NULL NULL .0000 NULL NULL
010213 轴合页 NULL NULL .0000 NULL NULL
010214 执手 NULL NULL .0000 NULL NULL
010215 门插 NULL NULL .0000 NULL NULL
010216 顺位器 NULL NULL .0000 NULL NULL
010217 珍珠岩板NULL NULL .0000 NULL NULL
010218 延绵条 NULL NULL .0000 NULL NULL
010219 防火胶 NULL NULL .0000 NULL NULL
010220 防火胶条NULL NULL .0000 NULL NULL
010221 胶水 NULL NULL .0000 NULL NULL declare @str varchar(4000)
set @str=''
select @str=@str+','+leibie+
'=sum(case when leibie='+QUOTENAME(leibie,'''')+' then shuliang else 0 end)'
from temp1
group by leibie
print @str
set @str='select danhao '+@str+' from temp1 group by danhao'
print @str
exec(@str)正常bianhao为null显示的应该也是这样的
bianhao 铁板0.8 铁板1.4 大边框 暗插销 .. 胶水
temp1表
bh leibie danwei ypid shuliang riqi danhao
010201 铁板0.8 NULL NULL .0000 NULL NULL
010202 铁板1.4 NULL NULL .0000 NULL NULL
010203 大边框 NULL NULL .0000 NULL NULL
010204 暗插销 NULL NULL .0000 NULL NULL
010205 粉末 NULL NULL .0000 NULL NULL
010206 合页 NULL NULL .0000 NULL NULL
010207 背板 NULL NULL .0000 NULL NULL
010208 防火锁 NULL NULL .0000 NULL NULL
010209 闭门器 NULL NULL .0000 NULL NULL
010210 管井锁 NULL NULL .0000 NULL NULL
010211 防盗锁 NULL NULL .0000 NULL NULL
010212 明插 NULL NULL .0000 NULL NULL
010213 轴合页 NULL NULL .0000 NULL NULL
010214 执手 NULL NULL .0000 NULL NULL
010215 门插 NULL NULL .0000 NULL NULL
010216 顺位器 NULL NULL .0000 NULL NULL
010217 珍珠岩板NULL NULL .0000 NULL NULL
010218 延绵条 NULL NULL .0000 NULL NULL
010219 防火胶 NULL NULL .0000 NULL NULL
010220 防火胶条NULL NULL .0000 NULL NULL
010221 胶水 NULL NULL .0000 NULL NULL declare @str varchar(4000)
set @str=''
select @str=@str+','+leibie+
'=sum(case when leibie='+QUOTENAME(leibie,'''')+' then shuliang else 0 end)'
from temp1
group by leibie
print @str
set @str='select danhao '+@str+' from temp1 group by danhao'
print @str
exec(@str)正常bianhao为null显示的应该也是这样的
bianhao 铁板0.8 铁板1.4 大边框 暗插销 .. 胶水
GO
IF OBJECT_ID('TBL')IS NOT NULL
DROP TABLE TBL
GO
CREATE TABLE TBL(
bh VARCHAR(6),
leibie VARCHAR(10),
danwei VARCHAR(4),
ypid VARCHAR(5),
shuliang INT,
riqi DATETIME,
danhao VARCHAR(5)
)
GO
INSERT TBL(bh,leibie,shuliang)
SELECT '010201','铁板0.8',0 UNION ALL
SELECT '','铁板1.4',0 UNION ALL
SELECT '010203','大边框',0 UNION ALL
SELECT '','暗插销',0 UNION ALL
SELECT '010205','粉末',0 UNION ALL
SELECT '010206','合页',0
DECLARE @STR VARCHAR(2000)
SET @STR=''
SELECT @STR=@STR+','+QUOTENAME(leibie,'[]')+'=MAX(CASE WHEN leibie='+QUOTENAME(leibie,'''')
+' THEN shuliang ELSE 0 END)' FROM TBL
GROUP BY leibie
SET @STR='SELECT ISNULL(danhao,'''') AS bianhao'+@STR+' FROM TBL
GROUP BY danhao'
PRINT @STR
EXEC(@STR)
/*
bianhao 暗插销 大边框 粉末 合页 铁板0.8 铁板1.4
0 0 0 0 0 0
*/
如果不是按leibie来排序的话,在构造sql语句时,需增加一个编号的排序,在这里可以使用min(bh)来排序,如果有重复的,取第一个