竖转横的问题

mythqxh 2009-11-12 03:48:24
SELECT h.HistoryGUID, hch.Name AS HardwareClass, hmh.Specification AS ChildModel, pmh.Specification AS ParentModel, hmfh.Name AS Manufacturer,
h.Specification
FROM dbo.Hardware AS h INNER JOIN
dbo.Hardware AS hh ON h.ID = hh.ID AND hh.IsNewest = 1 INNER JOIN
dbo.Model AS hm ON h.HardwareModelGUID = hm.HistoryGUID INNER JOIN
dbo.Model AS hmh ON hm.ID = hmh.ID AND hmh.IsNewest = 1 INNER JOIN
dbo.ModelClass AS hmc ON hm.HistoryGUID = hmc.ModelGUID INNER JOIN
dbo.Classification AS hc ON hmc.ClassGUID = hc.HistoryGUID AND hc.HistoryGUID IN ('00000000-0000-0000-0000-000000000011',
'00000000-0000-0000-0000-000000000012', '00000000-0000-0000-0000-000000000013') INNER JOIN
dbo.Classification AS hch ON hc.ID = hch.ID AND hch.IsNewest = 1 INNER JOIN
dbo.Model AS pm ON hm.ParentGUID = pm.HistoryGUID INNER JOIN
dbo.Model AS pmh ON pm.ID = pmh.ID AND pmh.IsNewest = 1 INNER JOIN
dbo.Manufacturer AS hmf ON hm.ManufacturerGUID = hmf.HistoryGUID INNER JOIN
dbo.Manufacturer AS hmfh ON hmf.ID = hmfh.ID AND hmfh.IsNewest = 1

我现在的SQL语句查询出来的结果是
HistoryGUID HardwareClass Childmodel Parentmodel manufacturer specification
5ee1ce10-c45c-4a0e-9e76-bb30bfb84bf4 CPU 2.3G T3800 Inter 520


希望把竖转横,希望得到的结果是
HistoryGUID CPU 内存l 硬盘
5ee1ce10-c45c-4a0e-9e76-bb30bfb84bf4 InterT38002.3G kingson白金1G 希捷新世界 200G


请问怎么做
...全文
148 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
lymmingv 2009-11-13
  • 打赏
  • 举报
回复
不知道是不是下面的结果。。。。。

SELECT h.HistoryGUID, hch.Name AS HardwareClass, hmh.Specification AS ChildModel,
pmh.Specification AS ParentModel, hmfh.Name AS Manufacturer,h.Specification
into #t
FROM dbo.Hardware AS h INNER JOIN
dbo.Hardware AS hh ON h.ID = hh.ID AND hh.IsNewest = 1 INNER JOIN
dbo.Model AS hm ON h.HardwareModelGUID = hm.HistoryGUID INNER JOIN
dbo.Model AS hmh ON hm.ID = hmh.ID AND hmh.IsNewest = 1 INNER JOIN
dbo.ModelClass AS hmc ON hm.HistoryGUID = hmc.ModelGUID INNER JOIN
dbo.Classification AS hc ON hmc.ClassGUID = hc.HistoryGUID AND hc.HistoryGUID IN ('00000000-0000-0000-0000-000000000011',
'00000000-0000-0000-0000-000000000012', '00000000-0000-0000-0000-000000000013') INNER JOIN
dbo.Classification AS hch ON hc.ID = hch.ID AND hch.IsNewest = 1 INNER JOIN
dbo.Model AS pm ON hm.ParentGUID = pm.HistoryGUID INNER JOIN
dbo.Model AS pmh ON pm.ID = pmh.ID AND pmh.IsNewest = 1 INNER JOIN
dbo.Manufacturer AS hmf ON hm.ManufacturerGUID = hmf.HistoryGUID INNER JOIN
dbo.Manufacturer AS hmfh ON hmf.ID = hmfh.ID AND hmfh.IsNewest = 1

--=====================================================================
create table #t
(
HistoryGUID varchar(100),
HardwareClass varchar(20),
Childmodel varchar(20),
Parentmodel varchar(20),
manufacturer varchar(20),
specification varchar(20)
)
insert #t select '5ee1ce10-c45c-4a0e-9e76-bb30bfb84bf4','CPU','2.3G','T3800','Inter','520'
insert #t select '5ee1ce10-c45c-4a0e-9e76-bb30bfb84bf5','内存','2G','1333','kingston','xxx'
insert #t select '5ee1ce10-c45c-4a0e-9e76-bb30bfb84bf6','硬盘','1T','7200','seagate','yyy'
insert #t select '5ee1ce10-c45c-4a0e-9e76-bb30bfb84bf7','CPU','3.0G','T3800','Inter','zzz'

select HistoryGUID,
max(case when cpu is not null then cpu + Parentmodel + Childmodel end) CPU,
max(case when 内存 is not null then 内存 + Parentmodel + Childmodel end) 内存,
max(case when 硬盘 is not null then 硬盘 + Parentmodel + Childmodel end) 硬盘
from (select * from #t) a
pivot (max(manufacturer) for HardwareClass in (cpu,内存,硬盘))b
group by HistoryGUID
mengzulin 2009-11-13
  • 打赏
  • 举报
回复
sql2005有专用的行列转换函数.
NDDavid 2009-11-12
  • 打赏
  • 举报
回复
DECLARE @S VARCHAR(8000)
SELECT @S = ISNULL(@S+'
UNION ALL ','')+'
SELECT COL1,COL2,NEWCOL='''+NAME+''' ,'+NAME+' AS NEWCOLV FROM TA '
FROM SYS.COLUMNS WHERE OBJECT_ID = OBJECT_ID('TA')AND NAME NOT IN('COL1','COL2')
PRINT( @S+ '
ORDER BY COL1,COL2,NEWCOL')
叶子 2009-11-12
  • 打赏
  • 举报
回复
行转列
nightgoblin 2009-11-12
  • 打赏
  • 举报
回复
好高深啊。学习下。。。
gaomiqzhi 2009-11-12
  • 打赏
  • 举报
回复
横转竖,行转列
小炮叔 2009-11-12
  • 打赏
  • 举报
回复
if exists (select * from sysobjects where name='t')
drop table t
create table t(NAMEID varchar(10),BC varchar(10),SL INT)
go
insert t
select '张三','A',4
union
select '张三','B',5
union
select '张三','C',3

SELECT * FROM T

select nameid,sum(a) A,sum(b) B,sum(c) C from (select nameid,
(case bc when 'a' then sl end ) a,
(case bc when 'b' then sl end ) b,
(case bc when 'c' then sl end ) c
from T ) as dd group by nameid
mythqxh 2009-11-12
  • 打赏
  • 举报
回复
请问我在这个语句中怎么转
mythqxh 2009-11-12
  • 打赏
  • 举报
回复
en .就是2楼的意思
--小F-- 2009-11-12
  • 打赏
  • 举报
回复
是不是2楼的意思?
--小F-- 2009-11-12
  • 打赏
  • 举报
回复
/*
问题:如果上述两表互相换一下:即表结构和数据为:
姓名 语文 数学 物理
张三 74  83  93
李四 74  84  94
想变成(得到如下结果):
姓名 课程 分数
---- ---- ----
李四 语文 74
李四 数学 84
李四 物理 94
张三 语文 74
张三 数学 83
张三 物理 93
--------------
*/

create table tb(姓名 varchar(10) , 语文 int , 数学 int , 物理 int)
insert into tb values('张三',74,83,93)
insert into tb values('李四',74,84,94)
go

--SQL SERVER 2000 静态SQL。
select * from
(
select 姓名 , 课程 = '语文' , 分数 = 语文 from tb
union all
select 姓名 , 课程 = '数学' , 分数 = 数学 from tb
union all
select 姓名 , 课程 = '物理' , 分数 = 物理 from tb
) t
order by 姓名 , case 课程 when '语文' then 1 when '数学' then 2 when '物理' then 3 end

--SQL SERVER 2000 动态SQL。
--调用系统表动态生态。
declare @sql varchar(8000)
select @sql = isnull(@sql + ' union all ' , '' ) + ' select 姓名 , [课程] = ' + quotename(Name , '''') + ' , [分数] = ' + quotename(Name) + ' from tb'
from syscolumns
where name! = N'姓名' and ID = object_id('tb') --表名tb,不包含列名为姓名的其它列
order by colid asc
exec(@sql + ' order by 姓名 ')

--SQL SERVER 2005 动态SQL。
select 姓名 , 课程 , 分数 from tb unpivot (分数 for 课程 in([语文] , [数学] , [物理])) t

--SQL SERVER 2005 动态SQL,同SQL SERVER 2000 动态SQL。

--------------------
--小F-- 2009-11-12
  • 打赏
  • 举报
回复
没看明白 什么横转竖?

34,593

社区成员

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

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