2016-11-23 72 views
1

我試圖加入兩個表,以便StaffAll表是行並且Checks表是列。繼承人的數據的彙總:將額外的列添加到樞軸加入

StaffAll 
----------------------------------- 
| PeronsID | FirstName | LastName | 
----------------------------------- 
| 10001 | James | Smith | 
----------------------------------- 
| 10002 | David | Collins | 
----------------------------------- 
| 10003 | Sarah | Brown | 
----------------------------------- 

Checks 
------------------------------ 
| CheckID | PersonID | CheckTypeID | CheckDate | CheckExpiry | CheckData | 
---------------------------------------------------------------------------- 
| 100001 | 10001 |  CONR | 01/08/14 | 01/08/14 | "A string" | 
---------------------------------------------------------------------------- 
| 100002 | 10001 |  DBSC | 01/08/14 | 01/08/14 | BC5645646 | 
---------------------------------------------------------------------------- 
| 100003 | 10002 |  CONR | 01/08/14 | 01/08/14 | "Text abc" | 
---------------------------------------------------------------------------- 
| 100004 | 10003 |  DBSC | 01/08/14 | 01/08/14 | KG1215446 | 
---------------------------------------------------------------------------- 

這就是我想要產生

People_Checks 
------------------------------ 
| PersonID | LastName | CONR | CONR_Data | DBSC | DBSC_Data | 
--------------------------------------------------------------------------- 
| 10001 | Smith | 01/08/14 | "A String" | 01/08/14 | BC5645646 | 
---------------------------------------------------------------------------- 
| 10002 | Collins | 01/08/14 | "Text abc" | NULL | "NULL  | 
--------------------------------------------------------------------------- 
| 10003 | Brown | NULL |  NULL | 01/08/14 | KG1215446 | 
--------------------------------------------------------------------------- 

我已經成功地使用PIVOT以創建每個CheckTypeID列:

WITH SCSR AS (
    SELECT 
     S.PersonID, 
     S.FirstName, 
     S.LastName, 
     C.CheckDate, 
     C.CheckTypeID AS CheckTypeID 
    FROM 
     dbo.StaffAll S 
    INNER JOIN dbo.Checks C 
     ON S.PersonID = C.PersonID 
) 

SELECT * 
FROM 
    SCSR 
    PIVOT (MAX([CheckDate]) FOR [CheckTypeID] IN ([APPF], [CONR], [CONS], [CPCS], [DBSC], [DISQ], [EMPH], [FAID], [IDEN], [LIST],[MEDI],[MNDQ],[OFFR],[OFFS],[POLI],[PROH],[QUAL],[REF1],[REF2],[RISK],[SRTC],[WORK])) TT; 

無論如何,從檢查表中添加額外的PIVOT列。我想從Checks中包含CheckData列。

回答

1

只需使用條件聚合。在這種情況下,用子查詢或cross apply

select s.personid, s.lastname, c.* 
from staffall s cross apply 
    (select max(case when c.CheckTypeID = 'CONR' then checkdate end) as CONR, 
      max(case when c.CheckTypeID = 'CONR' then checkdata end) as CONR_data, 
      max(case when c.CheckTypeID = 'DBSC' then checkdate end) as DBSC, 
      max(case when c.CheckTypeID = 'DBSC' then checkdata end) as DBSC_data 
     from checks c 
     where c.personid = s.personid 
    ) c;