将额外列添加到PIVOT联接

时间:2016-11-23 18:18:52

标签: sql sql-server tsql

我尝试连接两个表,以便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;

无论如何都要从Checks表中添加额外的PIVOT列。我还要在Checks中包含CheckData列。

1 个答案:

答案 0 :(得分: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;