表yn,表yns,通过mainid关联,1对多关系。
表yn:
字段: mainid desc
内容: 1 aaaaa
2 bbbbb
3 cccc
表yns:
字段: mainid stage person
内容: 1 阶段A 张三
1 阶段B 李四
1 李四
1 fga 李四
2 阶段A 张三
2 阶段B 李四
2 阶段C 王五
希望能在查询中过滤掉除了(阶段A,阶段B,阶段C)的数据,以下面的形式列出数据:
mainid desc stage person stage person stage person
1 aaaaa 阶段A 张三 阶段B 李四
2 bbbbb 阶段A 张三 阶段B 李四 阶段C 王五
------解决方案--------------------
----------------------------------------------------------------
-- Author :DBA_Huangzj(發糞塗牆)
-- Date :2013-10-22 18:04:04
-- Version:
-- Microsoft SQL Server 2012 (SP1) - 11.0.3128.0 (X64)
-- Dec 28 2012 20:23:12
-- Copyright (c) Microsoft Corporation
-- Enterprise Edition (64-bit) on Windows NT 6.2 <X64> (Build 9200: ) (Hypervisor)
--
----------------------------------------------------------------
--> 测试数据:[yn]
if object_id('[yn]') is not null drop table [yn]
go
create table [yn]([mainid] int,[desc] varchar(5))
insert [yn]
select 1,'aaaaa' union all
select 2,'bbbbb' union all
select 3,'cccc'
--> 测试数据:[yns]
if object_id('[yns]') is not null drop table [yns]
go
create table [yns]([mainid] int,[stage] varchar(5),[person] varchar(4))
insert [yns]
select 1,'阶段A','张三' union all
select 1,'阶段B','李四' union all
select 1,'李四',null union all
select 1,'fga','李四' union all
select 2,'阶段A','张三' union all
select 2,'阶段B','李四' union all
select 2,'阶段C','王五'
--------------开始查询--------------------------
--select * from [yns]
select a.mainid,a.[DESC],'阶段A' stage,person=MAX(CASE WHEN stage='阶段A' THEN person ELSE NULL END ),
'阶段B' stage,person=MAX(CASE WHEN stage='阶段B' THEN person ELSE NULL END ),
'阶段C' stage,person=MAX(CASE WHEN stage='阶段C' THEN person ELSE NULL END )
from [yn] a INNER JOIN [yns] b ON a.mainid=b.mainid
WHERE stage IN ('阶段A','阶段B','阶段C')
GROUP BY a.mainid,a.[DESC]
----------------结果----------------------------
/*
mainid DESC stage person stage person stage person
----------- ----- ----- ------ ----- ------ ----- ------
1 aaaaa 阶段A 张三 阶段B 李四 阶段C NULL