SQL 行转列

后浪 2014-04-29 03:49:39
原始数据如下

BigGoodsAUID LabName LabCode
4450880 产地区域 澄海
4450880 IC语言 不分语种
4450880 材质 NULL
4450880 包装语言 NULL
4450880 是否时货 NULL
4450880 特殊商品 NULL
4450880 适用年龄 NULL
4450880 灯光 带灯光
4450880 声音 带声音
4450880 尺寸 小型
26430520 是否时货 非时货
26430520 产地区域 澄海
26430520 包装语言 英文包装
26430520 IC语言 无IC
26430520 特殊商品 非特殊商品
26430520 适用年龄 3岁+
26430520 材质 塑料
26430520 灯光 不带灯光
26430520 声音 不带声音
28718938 IC语言 其它
28718938 材质 EVA
28718938 产地区域 澄海
28718938 特殊商品 版权商品
28718938 适用年龄 0-6个月
28718938 是否时货 非时货
28718938 包装语言 其它
28718938 灯光 不带灯光
28718938 声音 带声音
28718938 尺寸 大型

现在要实现效果如下:

列名 4450880 26430520 28718938
产地区域 澄海 澄海 澄海
IC语言 不分语种 无IC 其它
材质 NULL 塑料 EVA
包装语言 NULL 英文包装 其它
是否时货 NULL 非时货 非时货
特殊商品 NULL 非特殊商品 版权商品
适用年龄 NULL 3岁+ 0-6个月
灯光 带灯光 不带灯光 不带灯光
声音 带声音 不带声音 带声音
尺寸 小型 null 大型


...全文
248 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
t101lian 2014-04-29
  • 打赏
  • 举报
回复
引用 5 楼 XiaoYe_Loison 的回复:
[quote=引用 4 楼 ap0405140 的回复:]

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)
*/
这个貌似不是动态的,记录集数目是不确定的[/quote] 还有3楼的呢
唐诗三百首 2014-04-29
  • 打赏
  • 举报
回复
引用 5 楼 XiaoYe_Loison 的回复:
这个貌似不是动态的,记录集数目是不确定的

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) t

select @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)
*/
小魚人 2014-04-29
  • 打赏
  • 举报
回复
發糞塗牆 2014-04-29
  • 打赏
  • 举报
回复
引用 5 楼 XiaoYe_Loison 的回复:
[quote=引用 4 楼 ap0405140 的回复:]

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)
*/
这个貌似不是动态的,记录集数目是不确定的[/quote]2楼的呢?
jiajiaren 2014-04-29
  • 打赏
  • 举报
回复
IF OBJECT_ID('Test') IS NOT NULL 
    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 行受影响)
*/
后浪 2014-04-29
  • 打赏
  • 举报
回复
引用 4 楼 ap0405140 的回复:

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)
*/
这个貌似不是动态的,记录集数目是不确定的
唐诗三百首 2014-04-29
  • 打赏
  • 举报
回复

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)
*/
t101lian 2014-04-29
  • 打赏
  • 举报
回复
 if object_id('tempdb..#a') is not null drop table #a
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
*/
發糞塗牆 2014-04-29
  • 打赏
  • 举报
回复
----------------------------------------------------------------
-- 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个月
*/
后浪 2014-04-29
  • 打赏
  • 举报
回复
我简化下数据吧

         ID                         TagName           ValueName   
         1                          IC语言             English 
         1                          特殊商品             保护 
         1                          服装                 戏服  
         2                          IC语言               china 
         2                          特殊商品             其他    
         2                          灯光                 红色    
得到下面这个结果


         列名                1                  2
         IC语言             English            china 
         特殊商品           保护               其他
         服装                戏服               null
         灯光                null              红色

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧