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

数据查询求帮忙,该怎么解决

2012-12-14 
数据查询求帮忙本帖最后由 limingyu831226 于 2012-12-03 11:29:59 编辑表 AIDBRIDXMLXNR1001张三是否死亡

数据查询求帮忙
本帖最后由 limingyu831226 于 2012-12-03 11:29:59 编辑 表 A
ID  BRID   XM      LX    NR
1   001  张三  是否死亡  是
2   001  张三  死亡原因  骤停
3   001  张三  死亡时间  2012-12-21
4   001  张三  死亡地点  家
5   002  张四  是否死亡  是
6   002  张四  死亡原因  骤停
7   002  张四  死亡时间  2012-12-21
8   002  张四  死亡地点  家


查询结果
BRID   XM    是否死亡  死亡原因  死亡时间     死亡地点
001  张三      是        骤停   2012-12-21    家
002  张四      是        骤停   2012-12-21    家

     


[最优解释]

----------------------------
-- Author  :TravyLee(物是人非事事休,欲语泪先流!)
-- Date    :2012-12-03 11:39:49
-- Version:

--      Microsoft SQL Server 2012 - 11.0.2100.60 (Intel X86) 

--Feb 10 2012 19:13:17 

--Copyright (c) Microsoft Corporation

--Enterprise Edition: Core-based Licensing on Windows NT 6.1 <X86> (Build 7601: Service Pack 1)

--
----------------------------
--> 测试数据:[表A]
if object_id('[表A]') is not null drop table [表A]
go 
create table [表A]
(
[ID] int,
[BRID] varchar(3),
[XM] varchar(4),
[LX] varchar(8),
[NR] varchar(10)
)
insert [表A]
select 1,'001','张三','是否死亡','是' union all
select 2,'001','张三','死亡原因','骤停' union all
select 3,'001','张三','死亡时间','2012-12-21' union all
select 4,'001','张三','死亡地点','家' union all
select 5,'002','张四','是否死亡','是' union all
select 6,'002','张四','死亡原因','骤停' union all
select 7,'002','张四','死亡时间','2012-12-21' union all
select 8,'002','张四','死亡地点','家'
go

/*
BRID   XM    是否死亡  死亡原因  死亡时间     死亡地点
001  张三      是        骤停   2012-12-21    家
002  张四      是        骤停   2012-12-21    家
*/
select
BRID,
XM,
是否死亡=MAX(CASE WHEN [LX]='是否死亡' THEN [NR] ELSE '' END),
死亡原因=MAX(CASE WHEN [LX]='死亡原因' THEN [NR] ELSE '' END),
死亡时间=MAX(CASE WHEN [LX]='死亡时间' THEN [NR] ELSE '' END),
死亡地点=MAX(CASE WHEN [LX]='死亡地点' THEN [NR] ELSE '' END)
FROM
[表A]
GROUP BY
BRID,
XM
/*
BRID XM   是否死亡       死亡原因       死亡时间       死亡地点


---- ---- ---------- ---------- ---------- ----------
001  张三   是          骤停         2012-12-21 家
002  张四   是          骤停         2012-12-21 家

(2 行受影响)


*/


[其他解释]
select BRID,   XM,
            case when LX='是否死亡'  then   NR else null  end,
            case when LX='死亡时间'  then   NR else null  end, 
           case when LX='死亡地点'  then   NR else null  end                     
from A 
group y  BRID,   XM
[其他解释]
--CREATE TABLE  A(ID INT, BRID  VARCHAR(3),  XM  VARCHAR(10),     LX VARCHAR(10),   NR VARCHAR(10))
--INSERT INTO a
--SELECT 1,   '001',  '张三',   '是否死亡' , '是'
--UNION ALL SELECT 2,   '001',  '张三',   '死亡原因' , '骤停'
--UNION ALL SELECT 3,   '001',  '张三',   '死亡时间',  '2012-12-21'
--UNION ALL SELECT 4,   '001',  '张三',  '死亡地点' , '家'
--UNION ALL SELECT 5,   '002',  '张四',  '是否死亡',  '是'
--UNION ALL SELECT 6,   '002',  '张四',  '死亡原因',  '骤停'
--UNION ALL SELECT 7,   '002',  '张四',  '死亡时间',  '2012-12-21'
--UNION ALL SELECT 8,   '002',  '张四',  '死亡地点',  '家'

DECLARE @s NVARCHAR(4000)
SET @s = ''
SELECT  @s = @s + ',' + QUOTENAME(lx) + '=max(case when [lx]='
        + QUOTENAME(lx, '''') + ' then [nr] else ''0'' end)'
FROM    a
GROUP BY lx
EXEC('select [brid],xm'+@s+' from a group by [brid],xm') 

/*
brid xm         是否死亡       死亡地点       死亡时间       死亡原因
---- ---------- ---------- ---------- ---------- ----------
001  张三         是          家          2012-12-21 骤停
002  张四         是          家          2012-12-21 骤停

(2 行受影响)
*/

------其他解决方案--------------------


都是牛人啊,谢谢了,大家分分吧。

热点排行