• 主页
  • 基础类
  • 应用实例
  • 新技术前沿

竖转横的问题

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


请问怎么做
...全文
102 点赞 收藏 12
写回复
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日
没看明白 什么横转竖?
回复 点赞
发动态
发帖子
MS-SQL Server
创建于2007-09-28

1.4w+

社区成员

25.3w+

社区内容

MS-SQL Server相关内容讨论专区
社区公告
暂无公告