我简化下数据吧 ID TagName ValueName
1 IC语言 English
1 特殊商品 保护
1 服装 戏服
2 IC语言 china
2 特殊商品 其他
2 灯光 红色 得到下面这个结果
列名 1 2
IC语言 English china
特殊商品 保护 其他
服装 戏服 null
灯光 null 红色
1 IC语言 English
1 特殊商品 保护
1 服装 戏服
2 IC语言 china
2 特殊商品 其他
2 灯光 红色 得到下面这个结果
列名 1 2
IC语言 English china
特殊商品 保护 其他
服装 戏服 null
灯光 null 红色
-- Author :DBA_HuangZJ(发粪涂墙)
-- Date :2014-04-29 15:58:50
-- Version:
-- Microsoft SQL Server 2008 R2 (RTM) - 10.50.1600.1 (X64)
-- Apr 2 2010 15:48:46
-- Copyright (c) Microsoft Corporation
-- Enterprise Edition (64-bit) on Windows NT 6.2 <X64> (Build 9200: ) (Hypervisor)
--
----------------------------------------------------------------
--> 测试数据[huang]
if object_id('[huang]') is not null drop table [huang]
go
create table [huang]([BigGoodsAUID] int,[LabName] nvarchar(8),[LabCode] nvarchar(10))
insert [huang]
select 4450880,N'产地区域',N'澄海' union all
select 4450880,N'IC语言',N'不分语种' union all
select 4450880,N'材质',null union all
select 4450880,N'包装语言',null union all
select 4450880,N'是否时货',null union all
select 4450880,N'特殊商品',null union all
select 4450880,N'适用年龄',null union all
select 4450880,N'灯光',N'带灯光' union all
select 4450880,N'声音',N'带声音' union all
select 4450880,N'尺寸',N'小型' union all
select 26430520,N'是否时货',N'非时货' union all
select 26430520,N'产地区域',N'澄海' union all
select 26430520,N'包装语言',N'英文包装' union all
select 26430520,N'IC语言',N'无IC' union all
select 26430520,N'特殊商品',N'非特殊商品' union all
select 26430520,N'适用年龄',N'3岁+' union all
select 26430520,N'材质',N'塑料' union all
select 26430520,N'灯光',N'不带灯光' union all
select 26430520,N'声音',N'不带声音' union all
select 28718938,N'IC语言',N'其它' union all
select 28718938,N'材质',N'EVA' union all
select 28718938,N'产地区域',N'澄海' union all
select 28718938,N'特殊商品',N'版权商品' union all
select 28718938,N'适用年龄',N'0-6个月' union all
select 28718938,N'是否时货',N'非时货' union all
select 28718938,N'包装语言',N'其它' union all
select 28718938,N'灯光',N'不带灯光' union all
select 28718938,N'声音',N'带声音' union all
select 28718938,N'尺寸',N'大型'
--------------生成数据--------------------------
declare @s nvarchar(4000)
set @s=''
Select @s=@s+','+quotename([BigGoodsAUID])+N'=max(case when [BigGoodsAUID]=N'+quotename(BigGoodsAUID,'''')+N' then [LabCode] else NULL end)'
from [huang] group by [BigGoodsAUID]
--SET @S=subSTRING(@S,2,LEN(@S))
exec('select [LabName]'+@s+' from [huang] GROUP BY [LabName]')
----------------结果----------------------------
/*
LabName 4450880 26430520 28718938
-------- ---------- ---------- ----------
IC语言 不分语种 无IC 其它
产地区域 澄海 澄海 澄海
包装语言 NULL 英文包装 其它
声音 带声音 不带声音 带声音
尺寸 小型 NULL 大型
是否时货 NULL 非时货 非时货
材质 NULL 塑料 EVA
灯光 带灯光 不带灯光 不带灯光
特殊商品 NULL 非特殊商品 版权商品
适用年龄 NULL 3岁+ 0-6个月
*/
create table #a
(
BigGoodsAUID varchar(10),
LabName varchar(50) ,
LabCode varchar(50)
)
insert into #a
select '4450880','产地区域','澄海' union all
select '4450880','IC语言','不分语种' union all
select '4450880 ',' 材质',NULL union all
select '4450880','包装语言' ,NULL union all
select '4450880','是否时货',NULL union all
select '4450880','特殊商品',NULL union all
select '4450880','灯光','带灯光' union all
select '4450880 ','声音','带声音' union all
select '4450880 ','尺寸','小型'--select * from #a
declare @s nvarchar(4000)
Select @s=isnull(@s+',','')+quotename(BigGoodsAUID) from #a group by BigGoodsAUID
declare @sql varchar(200)
set @sql='select * from #a pivot (max(LabCode) for BigGoodsAUID in('+@s+'))b'
exec(@sql)
/*
LabName 4450880 4450880
-------------------------------------------------- -------------------------------------------------- --------------------------------------------------
材质 NULL NULL
IC语言 不分语种 NULL
包装语言 NULL NULL
产地区域 澄海 NULL
尺寸 NULL 小型
灯光 带灯光 NULL
声音 NULL 带声音
是否时货 NULL NULL
特殊商品 NULL NULL
*/
create table xy
(ID int,TagName varchar(10),ValueName varchar(10))insert into xy
select 1,'IC语言','English' union all
select 1,'特殊商品','保护' union all
select 1,'服装','戏服' union all
select 2,'IC语言','china' union all
select 2,'特殊商品','其他' union all
select 2,'灯光','红色'
select a.TagName,
max(case when TagName=a.TagName and ID=1 then ValueName else null end) '1',
max(case when TagName=a.TagName and ID=2 then ValueName else null end) '2'
from xy a
group by a.TagName/*
TagName 1 2
---------- ---------- ----------
IC语言 English china
灯光 NULL 红色
服装 戏服 NULL
特殊商品 保护 其他(4 row(s) affected)
*/
DROP TABLE Test
go
CREATE TABLE Test
(
ID INT ,
TagName VARCHAR(50) ,
ValueName VARCHAR(50)
)
INSERT INTO Test
SELECT '1' ,
'IC语言' ,
'English'
UNION ALL
SELECT '1' ,
'特殊商品' ,
'保护'
UNION ALL
SELECT '1' ,
'服装' ,
'戏服'
UNION ALL
SELECT '2' ,
'IC语言' ,
'china'
UNION ALL
SELECT '2' ,
'特殊商品' ,
'其他'
UNION ALL
SELECT '2' ,
'灯光' ,
'红色'
GO
--------------------------------------------------查询(静态)--------------------------------------------------
SELECT TagName ,
MAX(CASE ID WHEN 1 THEN ValueName ELSE NULL
END) [1],MAX(CASE ID WHEN 2 THEN ValueName ELSE NULL
END) [2] FROM dbo.test GROUP BY TagName
--------------------------------------------------查询(动态)--------------------------------------------------
DECLARE @sql VARCHAR(8000)
SET @sql = 'select TagName'
SELECT @sql = @sql + ',max(case ID when ' + CONVERT(VARCHAR, ID)
+ ' then ValueName end) [' + CONVERT(VARCHAR, ID) + ']'
FROM (SELECT DISTINCT ID FROM test) AS a
SELECT @sql = @sql + ' from test group by TagName'EXEC(@sql)
/*
TagName 1 2
-------------------------------------------------- -------------------------------------------------- --------------------------------------------------
IC语言 English china
灯光 NULL 红色
服装 戏服 NULL
特殊商品 保护 其他(4 行受影响)
*/
create table xy
(ID int,TagName varchar(10),ValueName varchar(10))
insert into xy
select 1,'IC语言','English' union all
select 1,'特殊商品','保护' union all
select 1,'服装','戏服' union all
select 2,'IC语言','china' union all
select 2,'特殊商品','其他' union all
select 2,'灯光','红色'
declare @tsql varchar(6000)select @tsql=isnull(@tsql+',','')
+'max(case when TagName=a.TagName and ID='+rtrim(ID)+' then ValueName else null end) '''+rtrim(ID)+''' '
from (select distinct ID from xy) tselect @tsql='select a.TagName,'+@tsql
+' from xy a
group by a.TagName'exec(@tsql)
/*
TagName 1 2
---------- ---------- ----------
IC语言 English china
灯光 NULL 红色
服装 戏服 NULL
特殊商品 保护 其他(4 row(s) affected)
*/