首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

数据横转列查询,不用用游标

2013-07-04 
数据横转列查询,不要用游标Id 编号型号类型用户商家1 1001黑金刚内存小黄畅能科技2 1002七彩虹主板小黄畅

数据横转列查询,不要用游标
Id 编号  型号      类型      用户     商家
1 1001黑金刚内存小黄畅能科技
2 1002七彩虹主板小黄畅能科技
3 1003速龙cpu小黄畅能科技
4 1004西数160G硬盘小黄畅能科技
5 1005威刚内存小李昌泰科技
6 1006三星硬盘小李昌泰科技
7 1007双敏显卡小李昌泰科技
8 1008英特尔cpu小李昌泰科技
9 1009双敏主板小李昌泰科技
10 1010金士顿内存NULL昌泰科技
我要得到如下结果 
  用户   Cpu          主板          硬盘            内存        显卡
  小黄   1003速龙      1002七彩虹    1004西数160G   1001黑金刚  null
  小李   1008英特尔    1009双敏      1006三星       1005威刚   1007双敏

商家信息不用显示,用户为空的物品也不用显示,转换的列 固定 就为 用户 CPu 主板硬盘 内存 显卡 这5列 数据库查询横转列 行业数据
[解决办法]


with tb(Id,编号,型号,类型,用户,商家)as(
select 1,1001,'黑金刚','内存','小黄','畅能科技' union 
select 2,1002,'七彩虹','主板','小黄','畅能科技' union 
select 3,1003,'速龙','cpu','小黄','畅能科技' union
select 4,1004,'西数160G','硬盘','小黄','畅能科技' union 
select 5,1005,'威刚','内存','小李','昌泰科技' union 
select 6,1006,'三星','硬盘','小李','昌泰科技' union 
select 7,1007,'双敏','显卡','小李','昌泰科技' union 
select 8,1008,'英特尔','cpu','小李','昌泰科技' union 
select 9,1009,'双敏','主板','小李','昌泰科技' union 
select 10,1010,'金士顿','内存',NULL,'昌泰科技')
select 用户,
MAX(case when 类型='CPU' then convert(varchar,编号)+型号 else null end) CPU,
MAX(case when 类型='主板' then convert(varchar,编号)+型号 else null end) 主板, 
MAX(case when 类型='硬盘' then convert(varchar,编号)+型号 else null end) 硬盘, 
MAX(case when 类型='内存' then convert(varchar,编号)+型号 else null end) 内存, 


MAX(case when 类型='显卡' then convert(varchar,编号)+型号 else null end) 显卡 
from tb 
group by 用户
having 用户 is not null


[解决办法]
自己保存的一个SQL,你可以参考一下。


DECLARE @ColumnNames VARCHAR(3000)
    DECLARE @a VARCHAR(3000)
    SET @ColumnNames=''
    SET @a=''
    SELECT
       @ColumnNames = @ColumnNames + '[' + 类型 + '],',@a=@a+ 'ISNULL([' + 类型 + '],0),'
    FROM
       (
       SELECT DISTINCT 类型 FROM usrtable
       ) t ORDER BY t.类型
    SET @ColumnNames= LEFT(@ColumnNames, LEN(@ColumnNames)-1)
    SET @a= LEFT(@a, LEN(@a)-1)

    DECLARE @selectSQL NVARCHAR(3000)
    SET @selectSQL=' SELECT 用户,'+@a+' FROM (SELECT  用户,编号,型号,类型 FROM usrtable WITH(NOLOCK)) AS T
PIVOT (sum(型号+编号) FOR T.类型 in ('+@ColumnNames+')) AS s'
EXEC (@selectSQL)


[解决办法]
http://blog.csdn.net/peng13nannan/article/details/7751085
[解决办法]
这里有很多例子,请参考:
http://blog.csdn.net/hdhai9451/article/details/5026933 
[解决办法]
sql 2005之后可以使用行专列函数~~~

热点排行