日期:2014-05-17  浏览次数:20662 次

求sql语句(很多人都无法解决呀)
求sql语句:
以下在sql server2005上运行:

create table sbjc
(
区域 varchar(20),
设备状况 varchar(20),
设备ip varchar(50)
)

insert into sbjc values('外科','良好','192.168.1.1');
insert into sbjc values('皮肤科','异常','192.168.1.2');
insert into sbjc values('五官科','良好','192.168.1.3');
insert into sbjc values('外科','良好','192.168.1.4');
insert into sbjc values('外科','异常','192.168.1.5');
insert into sbjc values('皮肤科','异常','192.168.1.6');
insert into sbjc values('五官科','异常','192.168.1.7');
insert into sbjc values('外科','良好','192.168.1.8');
insert into sbjc values('内科','异常','192.168.1.9');
insert into sbjc values('内科','良好','192.168.1.10');
insert into sbjc values('口腔科','异常','192.168.1.13');
insert into sbjc values('口腔科','良好','192.168.1.14');
insert into sbjc values('内科','良好','192.168.1.70');
insert into sbjc values('五官科','良好','192.168.1.71');
select * from sbjc

区域 设备状况 设备ip
--------------------------------
外科 良好 192.168.1.1
皮肤科 异常 192.168.1.2
五官科 良好 192.168.1.3
外科 良好 192.168.1.4
外科 异常 192.168.1.5
皮肤科 异常 192.168.1.6
五官科 异常 192.168.1.7
外科 良好 192.168.1.8
内科 异常 192.168.1.9
内科 良好 192.168.1.10
口腔科 异常 192.168.1.13
口腔科 良好 192.168.1.14
内科 良好 192.168.1.70
五官科 良好 192.168.1.71

问题:用SQL语或程序,按如下格式显示:


外科 皮肤科 五官科 内科 口腔科
-----------------------------------------------------
异常192.168.1.5 异常192.168.1.2 异常192.168.1.7 异常192.168.1.9 异常192.168.1.13
良好192.168.1.1 异常192.168.1.6 良好192.168.1.3 良好192.168.1.10 良好192.168.1.14
良好192.168.1.4 良好192.168.1.71 良好192.168.1.70
良好192.168.1.8

补充一下,在显示结果的时候,需要将异常的设备IP排列在前面。



------解决方案--------------------
SQL code
DECLARE @sql VARCHAR(max)
SELECT @sql=ISNULL(@sql+',','')+QUOTENAME([区域]) FROM sbjc 
GROUP BY [区域]
EXEC('
SELECT '+@sql+' FROM 
(
    SELECT 区域,设备状况+设备ip as 设备,rn=row_number() over(partition by 区域 order by charindex(设备状况,''良好异常'')) FROM sbjc 
)a
PIVOT (max(设备) FOR [区域] IN('+@sql+')) b
')
/*
口腔科    内科    皮肤科    外科    五官科
良好192.168.1.14    良好192.168.1.70    异常192.168.1.2    良好192.168.1.1    良好192.168.1.3
异常192.168.1.13    良好192.168.1.10    异常192.168.1.6    良好192.168.1.8    良好192.168.1.71
NULL    异常192.168.1.9    NULL    良好192.168.1.4    异常192.168.1.7
NULL    NULL    NULL    异常192.168.1.5    NULL
*/