2017-05-01 3 views
1

Angenommen habe ich die folgenden:SQL: Zeile Spaltendaten

if object_id('tempdb..#Dependents') is not null 
    drop table #Dependents 

create table #Dependents 
(EmpNo varchar(12), DepID varchar(12), Relation varchar(12)); 
go 

if object_id('tempdb..#Dep_Benefits') is not null 
    drop table #Dep_Benefits 

create table #Dep_Benefits 
(DepID varchar(12), PlanCode varchar(12), Coverage varchar(25)); 
go 


INSERT INTO #Dependents VALUES('001', '111', 'SON'); 
INSERT INTO #Dependents VALUES('001', '222', 'SON'); 
INSERT INTO #Dependents VALUES('001', '333', 'DAUGHTER'); 
INSERT INTO #Dependents VALUES('002', '666', 'SON'); 
INSERT INTO #Dependents VALUES('002', '777', 'DAUGHTER'); 

INSERT INTO #Dep_Benefits VALUES('111', 'AAAA', 'MEDICAL'); 
INSERT INTO #Dep_Benefits VALUES('111', 'BBBB', 'DENTAL'); 
INSERT INTO #Dep_Benefits VALUES('111', 'CCCC', 'VISION'); 
INSERT INTO #Dep_Benefits VALUES('111', 'DDDD', 'DISABL'); 
INSERT INTO #Dep_Benefits VALUES('222', 'AAAA', 'MEDICAL'); 
INSERT INTO #Dep_Benefits VALUES('222', 'BBBB', 'DENTAL'); 
INSERT INTO #Dep_Benefits VALUES('222', 'CCCC', 'VISION'); 
INSERT INTO #Dep_Benefits VALUES('333', 'AAAA', 'MEDICAL'); 
INSERT INTO #Dep_Benefits VALUES('333', 'BBBB', 'DENTAL'); 
INSERT INTO #Dep_Benefits VALUES('666', 'AAAA', 'MEDICAL'); 
INSERT INTO #Dep_Benefits VALUES('666', 'BBBB', 'DENTAL'); 
INSERT INTO #Dep_Benefits VALUES('666', 'CCCC', 'VISION'); 


SELECT * FROM #Dependents; 
SELECT * FROM #Dep_Benefits; 

Wie kann ich den Ausgang dieses erhalten werden wie:

Employee | Dependent | Plan 1 | Plan 2 | Plan 3 
001   111   AAAA  BBBB  DDDD 
001   222   AAAA  BBBB  CCCC 
001   333   AAAA  BBBB  
002   666   AAAA  BBBB  CCCC 

I mit 3 Pläne nur besorgt bin, auch wenn einem Abhängigen mehr zugeordnet ist. Dies ist eine feste Anfrage von einem Kunden (nur 3 Pläne) also bitte keine Kommentare, warum dies eine schlechte Idee wäre :) Ich habe ihnen bereits gesagt, dass es keine Garantie gibt, welche 3 Pläne zurückgegeben werden können, wenn ein Abhängiger mehr als 3 hat .

Ich habe mir eine Pivot-Tabelle angeschaut, aber es scheint einfach nicht zu funktionieren.

Antwort

0

eine row_number() Mit den Plänen zur Nummer und bedingte Aggregation:

select 
    d.empno 
    , d.depid 
    , Plan_1 = max(case when rn = 1 then PlanCode end) 
    , Plan_2 = max(case when rn = 2 then PlanCode end) 
    , Plan_3 = max(case when rn = 3 then PlanCode end) 
    , Plan_4 = max(case when rn = 4 then PlanCode end) 
from (
    select d.empNo, db.* 
    , rn = row_number() over(partition by db.depid order by plancode) 
    from #Dependents d 
    inner join #Dep_Benefits db 
    on d.depid = db.depid 
) d 
group by d.empno, d.depid 

rextester Demo: http://rextester.com/FNLH5237

kehrt:

+-------+-------+--------+--------+--------+--------+ 
| empno | depid | Plan_1 | Plan_2 | Plan_3 | Plan_4 | 
+-------+-------+--------+--------+--------+--------+ 
| 001 | 111 | AAAA | BBBB | CCCC | DDDD | 
| 001 | 222 | AAAA | BBBB | CCCC | NULL | 
| 001 | 333 | AAAA | BBBB | NULL | NULL | 
| 002 | 666 | AAAA | BBBB | CCCC | NULL | 
+-------+-------+--------+--------+--------+--------+ 

die Pläne nach Typ Schwenken bedingte Verwendung Aggregation:

select 
    d.empno 
    , d.depid 
    , Medical = max(case when db.Coverage = 'Medical' then PlanCode end) 
    , Dental  = max(case when db.Coverage = 'Dental' then PlanCode end) 
    , Vision  = max(case when db.Coverage = 'Vision' then PlanCode end) 
    , Disability = max(case when db.Coverage = 'disabl' then PlanCode end) 
from #Dependents d 
    inner join #Dep_Benefits db 
    on d.depid = db.depid 
group by d.empno, d.depid 

kehrt:

+-------+-------+---------+--------+--------+------------+ 
| empno | depid | Medical | Dental | Vision | Disability | 
+-------+-------+---------+--------+--------+------------+ 
| 001 | 111 | AAAA | BBBB | CCCC | DDDD  | 
| 001 | 222 | AAAA | BBBB | CCCC | NULL  | 
| 001 | 333 | AAAA | BBBB | NULL | NULL  | 
| 002 | 666 | AAAA | BBBB | CCCC | NULL  | 
+-------+-------+---------+--------+--------+------------+ 
Verwandte Themen