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

较为简单而又麻烦的查询

2012-01-22 
求一个较为简单而又麻烦的查询各位老师:我想将表A的记录查询后得到表B表A名称代码数值东安屯高度DA_G20东

求一个较为简单而又麻烦的查询
各位老师:我想将表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 '

热点排行