求一个较为简单而又麻烦的查询
各位老师:我想将表A的记录查询后得到表B
表A
名称 代码 数值
东安屯高度 DA_G 20
东安屯温度 DA_W 10
张庄高度 ZZ_W 5
大山屯温度 DS_W 10
大山屯高度 DS_G 20
大山屯深度 DS_S 45
张庄深度 ZZ_S 32
东安屯深度 DA_S 65
张庄温度 ZZ_W 12
表B
地点 高度 温度 深度
东安屯 20 10 65
张庄 5 12 32
大山屯 20 10 45
[解决办法]
if object_id( 'pubs..tb ') is not null
drop table tb
go
create table tb
(
名称 varchar(10),
代码 varchar(10),
数值 int
)
insert into tb(名称,代码,数值) values( '东安屯高度 ', 'DA_G ',20)
insert into tb(名称,代码,数值) values( '东安屯温度 ', 'DA_W ',10)
insert into tb(名称,代码,数值) values( '张庄高度 ' , 'ZZ_W ', 5)
insert into tb(名称,代码,数值) values( '大山屯温度 ', 'DS_W ',10)
insert into tb(名称,代码,数值) values( '大山屯高度 ', 'DS_G ',20)
insert into tb(名称,代码,数值) values( '大山屯深度 ', 'DS_S ',45)
insert into tb(名称,代码,数值) values( '张庄深度 ' , 'ZZ_S ',32)
insert into tb(名称,代码,数值) values( '东安屯深度 ', 'DA_S ',65)
insert into tb(名称,代码,数值) values( '张庄温度 ' , 'ZZ_W ',12)
select left(名称,len(rtrim(名称))-2) as 地点,
max(case when right(名称,2) = '高度 ' then 数值 else null end) as 高度,
max(case when right(名称,2) = '温度 ' then 数值 else null end) as 温度,
max(case when right(名称,2) = '深度 ' then 数值 else null end) as 深度
from tb
group by left(名称,len(rtrim(名称))-2)
drop table tb
地点 高度 温度 深度
---------- ----------- ----------- -----------
大山屯 20 10 45
东安屯 20 10 65
张庄 5 12 32
(所影响的行数为 3 行)
[解决办法]
select left(max(名称),len(min(名称))-2),
高度=max( CASE right(名称,2) WHEN '高度 ' THEN 数值 ELSE null END ),
温度=max(CASE right(名称,2) WHEN '温度 ' THEN 数值 ELSE null END) ,
深度=max(CASE right(名称,2) WHEN '深度 ' THEN 数值 ELSE null END )
from a
group by left(名称,len(名称)-2)
[解决办法]
select * into B from A
update B set 名称=left(名称,charindex( '高度 ',名称)-1),名称=left(名称,charindex( '温度 ',名称)-1),名称=left(名称,charindex( '深度 ',名称)-1)
select b1.名称,高度=b1.数值,温度=b2.数值,深度=b3.数值 from B B1,B B2,B B3 where
B1.名称=B2.名称 and B1.名称=B3.名称 and B2.名称=B3.名称 and
B1.数值 <> B2.数值 and B1.数值 <> B3.数值 and B2.数值 <> B3.数值 and
right(B1.代码,1)= 'G ' and right(B2.代码,1)= 'W ' and right(B3.代码,1)= 'S '