2017-04-25 26 views
1

這是對已部分回答的其他問題的延續,但我認爲現在的狀態已經丟失。Dynamic Pivot中的列不會在下一個重要項目處重新開始

首先,我有一個臨時表,其中存儲了一些用於查詢數據庫的變量。從那裏,我建立了一個臨時表,以確定符合以下查詢特定標準的訪問:

SELECT 
    spl.trac_id 
    ,CONVERT(DATE,pev.CONTACT_DATE) AS 'Contact' 

INTO 
    #medmtemp 

FROM 
    #SAMHSA_PAT_LIST spl 
    INNER JOIN dbo.IDENTITY_ID_VIEW iiv 
    ON iiv.IDENTITY_ID=spl.MRN 
    LEFT JOIN dbo.PAT_ENC_VIEW pev 
    ON pev.PAT_ID = iiv.PAT_ID 
    LEFT JOIN dbo.PAT_ENC_RSN_VISIT_VIEW rsn 
    ON rsn.PAT_ENC_CSN_ID=pev.PAT_ENC_CSN_ID 

WHERE 
    pev.CONTACT_DATE >= @Start_Date 
    AND pev.CONTACT_DATE < @End_Date 
    AND pev.APPT_STATUS_C IN (2 , 6 , 8 , 9) 
    AND rsn.ENC_REASON_ID = 590; 

從那裏我已經創建了一個支點查詢,如下所示:

DECLARE @SQL NVARCHAR(MAX)='' 
     ,@PVT_COL NVARCHAR(MAX)=''; 

SELECT @PVT_COL [email protected]_COL + '[mm_'+CAST(ROW_NUMBER() OVER(ORDER BY (SELECT 1)) AS VARCHAR(4))+'],' 
    FROM #medmtemp 
SELECT @PVT_COL = LEFT(@PVT_COL,LEN(@PVT_COL)-1) 

SELECT @SQL = 
N'SELECT * FROM (
SELECT [trac_id], Contact ,''mm_''+CAST(ROW_NUMBER() OVER(ORDER BY (SELECT 1)) AS VARCHAR(4)) AS COL_NME 
FROM #medmtemp 
)AS A 
PIVOT 
(
    MAX(Contact) FOR COL_NME IN (' + @PVT_COL + ') 
)PVT' 

EXECUTE (@SQL) 

不幸的是,結果我看到有這樣的:

trac_id mm_1 mm_2 mm_3 mm_4 mm_5 mm_6 mm_7 mm_8 mm_9 mm_10 mm_11 mm_12 mm_13 mm_14 mm_15 mm_16 mm_17 mm_18 mm_19 mm_20 
001 2017-03-01 2017-03-08 2017-03-13 2017-03-16 2017-03-16 2017-03-17 2017-03-22 2017-03-23 2017-03-23 2017-03-24 2017-03-27 2017-03-27 2017-03-30 2017-03-31 NULL NULL NULL NULL NULL NULL 
005 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL 2017-02-16 2017-03-18 2017-03-08 NULL NULL NULL 
008 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL 2017-03-08 2017-03-23 2017-03-30 

我想要的數據被格式化爲:

trac_id mm_1 mm_2 mm_3 mm_4 mm_5 mm_6 mm_7 mm_8 mm_9 mm_10 mm_11 mm_12 mm_13 mm_14 
1 3/1/2017 3/8/2017 3/13/2017 3/16/2017 3/16/2017 3/17/2017 3/22/2017 3/23/2017 3/23/2017 3/24/2017 3/27/2017 3/27/2017 3/30/2017 3/31/2017 
5 2/16/2017 3/18/2017 3/8/2017 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL 
8 3/8/2017 3/23/2017 3/30/2017 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL 

更好的是,如果NULL列是空白的,但這更好。我希望我能解決這個問題,因爲我將在多個查詢中使用相同的PIVOT格式。

回答

0

的關鍵是,包括在row_number()

declare @cols nvarchar(max); 
declare @sql nvarchar(max); 

    select @cols = stuff((
    select distinct 
     ',' + quotename('mm_' 
      + right('0' +convert(nvarchar(10),row_number() over (
       partition by trac_id 
       order by  contact 
     )),2) 
     ) 
     from t 
     for xml path (''), type).value('.','nvarchar(max)') 
    ,1,1,''); 

select @sql = ' 
select trac_id, ' + @cols + ' 
    from (
    select 
     trac_id 
     , contact = convert(char(10),contact,120) 
     , rn=''mm_''+right(''0'' +convert(nvarchar(10),row_number() over (
       partition by trac_id 
       order by  contact 
     )),2) 
     from t 
    ) as a 
pivot (max([contact]) for [rn] in (' + @cols + ')) p'; 
select @sql as CodeGenerated; 
exec sp_executesql @sql; 

rextester演示partition by trac_idhttp://rextester.com/XDVOTD39040

回報:

+--------------------------------------------------------------------------------------------------------------------------------------------------------------+ 
|                  CodeGenerated                   | 
+--------------------------------------------------------------------------------------------------------------------------------------------------------------+ 
| select trac_id, [mm_01],[mm_02],[mm_03],[mm_04],[mm_05],[mm_06],[mm_07],[mm_08],[mm_09],[mm_10],[mm_11],[mm_12],[mm_13],[mm_14]        | 
|  from (                                    | 
|   select                                    | 
|    trac_id                                   | 
|   , contact = convert(char(10),contact,120)                           | 
|   , rn='mm_'+right('0' +convert(nvarchar(10),row_number() over (                     | 
|     partition by trac_id                              | 
|     order by  contact                              | 
|    )),2)                                   | 
|   from t                                    | 
|   ) as a                                    | 
|  pivot (max([contact]) for [rn] in ([mm_01],[mm_02],[mm_03],[mm_04],[mm_05],[mm_06],[mm_07],[mm_08],[mm_09],[mm_10],[mm_11],[mm_12],[mm_13],[mm_14])) p | 
+--------------------------------------------------------------------------------------------------------------------------------------------------------------+ 

+---------+------------+------------+------------+------------+------------+------------+------------+------------+------------+------------+------------+------------+------------+------------+ 
| trac_id | mm_01 | mm_02 | mm_03 | mm_04 | mm_05 | mm_06 | mm_07 | mm_08 | mm_09 | mm_10 | mm_11 | mm_12 | mm_13 | mm_14 | 
+---------+------------+------------+------------+------------+------------+------------+------------+------------+------------+------------+------------+------------+------------+------------+ 
|  001 | 2017-03-01 | 2017-03-08 | 2017-03-13 | 2017-03-16 | 2017-03-16 | 2017-03-17 | 2017-03-22 | 2017-03-23 | 2017-03-23 | 2017-03-24 | 2017-03-27 | 2017-03-27 | 2017-03-30 | 2017-03-31 | 
|  005 | 2017-02-16 | 2017-03-08 | 2017-03-18 | NULL  | NULL  | NULL  | NULL  | NULL  | NULL  | NULL  | NULL  | NULL  | NULL  | NULL  | 
|  011 | 2017-02-16 | 2017-03-01 | 2017-03-23 | 2017-03-30 | NULL  | NULL  | NULL  | NULL  | NULL  | NULL  | NULL  | NULL  | NULL  | NULL  | 
|  013 | 2017-03-08 | 2017-03-13 | 2017-03-16 | 2017-03-16 | 2017-03-17 | 2017-03-22 | 2017-03-23 | 2017-03-24 | 2017-03-27 | 2017-03-27 | 2017-03-30 | 2017-03-30 | 2017-03-31 | NULL  | 
|  040 | 2017-02-20 | NULL  | NULL  | NULL  | NULL  | NULL  | NULL  | NULL  | NULL  | NULL  | NULL  | NULL  | NULL  | NULL  | 
|  043 | 2017-02-03 | NULL  | NULL  | NULL  | NULL  | NULL  | NULL  | NULL  | NULL  | NULL  | NULL  | NULL  | NULL  | NULL  | 
|  059 | 2017-03-08 | NULL  | NULL  | NULL  | NULL  | NULL  | NULL  | NULL  | NULL  | NULL  | NULL  | NULL  | NULL  | NULL  | 
|  060 | 2017-02-08 | 2017-03-07 | NULL  | NULL  | NULL  | NULL  | NULL  | NULL  | NULL  | NULL  | NULL  | NULL  | NULL  | NULL  | 
|  067 | 2017-01-24 | NULL  | NULL  | NULL  | NULL  | NULL  | NULL  | NULL  | NULL  | NULL  | NULL  | NULL  | NULL  | NULL  | 
|  068 | 2017-02-13 | NULL  | NULL  | NULL  | NULL  | NULL  | NULL  | NULL  | NULL  | NULL  | NULL  | NULL  | NULL  | NULL  | 
+---------+------------+------------+------------+------------+------------+------------+------------+------------+------------+------------+------------+------------+------------+------------+ 

null值轉換爲空字符串:

declare @cols nvarchar(max); 
declare @select_cols nvarchar(max); 
declare @sql nvarchar(max); 

    select @cols = stuff((
    select distinct 
     ',' + quotename('mm_' 
      + right('0' +convert(nvarchar(10),row_number() over (
       partition by trac_id 
       order by  contact 
     )),2) 
     ) 
     from t 
     for xml path (''), type).value('.','nvarchar(max)') 
    ,1,1,''); 

select @select_cols = (
    select distinct 
     char(10)+'  , ' + quotename('mm_' 
      + right('0' +convert(nvarchar(10),row_number() over (
       partition by trac_id 
       order by  contact 
     )),2) 
     ) +' = isnull('+ 
     quotename('mm_' 
      + right('0' +convert(nvarchar(10),row_number() over (
       partition by trac_id 
       order by  contact 
     )),2) 
     )+','''')' 
     from t 
     for xml path (''), type).value('.','nvarchar(max)') 

select @sql = ' 
select trac_id' + @select_cols + ' 
from (
    select 
     trac_id 
     , contact = convert(char(10),contact,120) 
     , rn=''mm_''+right(''0'' +convert(nvarchar(10),row_number() over (
       partition by trac_id 
       order by  contact 
     )),2) 
    from t 
    ) as a 
pivot (max([contact]) for [rn] in (' + @cols + ')) p'; 
select @sql as CodeGenerated; 
exec sp_executesql @sql; 

rextester演示:http://rextester.com/HDTK5946

回報:

+--------------------------------------------------------------------------------------------------------------------------------------------------------------+ 
|                  CodeGenerated                   | 
+--------------------------------------------------------------------------------------------------------------------------------------------------------------+ 
|  select trac_id                                   | 
|   , [mm_01] = isnull([mm_01],'')                              | 
|   , [mm_02] = isnull([mm_02],'')                              | 
|   , [mm_03] = isnull([mm_03],'')                              | 
|   , [mm_04] = isnull([mm_04],'')                              | 
|   , [mm_05] = isnull([mm_05],'')                              | 
|   , [mm_06] = isnull([mm_06],'')                              | 
|   , [mm_07] = isnull([mm_07],'')                              | 
|   , [mm_08] = isnull([mm_08],'')                              | 
|   , [mm_09] = isnull([mm_09],'')                              | 
|   , [mm_10] = isnull([mm_10],'')                              | 
|   , [mm_11] = isnull([mm_11],'')                              | 
|   , [mm_12] = isnull([mm_12],'')                              | 
|   , [mm_13] = isnull([mm_13],'')                              | 
|   , [mm_14] = isnull([mm_14],'')                              | 
|  from (                                    | 
|   select                                    | 
|    trac_id                                   | 
|   , contact = convert(char(10),contact,120)                           | 
|   , rn='mm_'+right('0' +convert(nvarchar(10),row_number() over (                     | 
|     partition by trac_id                              | 
|     order by  contact                              | 
|    )),2)                                   | 
|   from t                                    | 
|   ) as a                                    | 
|  pivot (max([contact]) for [rn] in ([mm_01],[mm_02],[mm_03],[mm_04],[mm_05],[mm_06],[mm_07],[mm_08],[mm_09],[mm_10],[mm_11],[mm_12],[mm_13],[mm_14])) p | 
+--------------------------------------------------------------------------------------------------------------------------------------------------------------+ 

+---------+------------+------------+------------+------------+------------+------------+------------+------------+------------+------------+------------+------------+------------+------------+ 
| trac_id | mm_01 | mm_02 | mm_03 | mm_04 | mm_05 | mm_06 | mm_07 | mm_08 | mm_09 | mm_10 | mm_11 | mm_12 | mm_13 | mm_14 | 
+---------+------------+------------+------------+------------+------------+------------+------------+------------+------------+------------+------------+------------+------------+------------+ 
|  001 | 2017-03-01 | 2017-03-08 | 2017-03-13 | 2017-03-16 | 2017-03-16 | 2017-03-17 | 2017-03-22 | 2017-03-23 | 2017-03-23 | 2017-03-24 | 2017-03-27 | 2017-03-27 | 2017-03-30 | 2017-03-31 | 
|  005 | 2017-02-16 | 2017-03-08 | 2017-03-18 |   |   |   |   |   |   |   |   |   |   |   | 
|  011 | 2017-02-16 | 2017-03-01 | 2017-03-23 | 2017-03-30 |   |   |   |   |   |   |   |   |   |   | 
|  013 | 2017-03-08 | 2017-03-13 | 2017-03-16 | 2017-03-16 | 2017-03-17 | 2017-03-22 | 2017-03-23 | 2017-03-24 | 2017-03-27 | 2017-03-27 | 2017-03-30 | 2017-03-30 | 2017-03-31 |   | 
|  040 | 2017-02-20 |   |   |   |   |   |   |   |   |   |   |   |   |   | 
|  043 | 2017-02-03 |   |   |   |   |   |   |   |   |   |   |   |   |   | 
|  059 | 2017-03-08 |   |   |   |   |   |   |   |   |   |   |   |   |   | 
|  060 | 2017-02-08 | 2017-03-07 |   |   |   |   |   |   |   |   |   |   |   |   | 
|  067 | 2017-01-24 |   |   |   |   |   |   |   |   |   |   |   |   |   | 
|  068 | 2017-02-13 |   |   |   |   |   |   |   |   |   |   |   |   |   | 
+---------+------------+------------+------------+------------+------------+------------+------------+------------+------------+------------+------------+------------+------------+------------+ 
+0

很多次anks @SqlZim。所以,用source temp表的名稱替換你列出的't',給了我後面的東西。最後一個問題是,我可以將它插入一個新的臨時表嗎? – Erik

+0

@Erik當然。您可以在動態代碼'select ... into ## pivoted'內使用全局臨時表,例如http://rextester.com/EQDH71409 – SqlZim

+0

如果我只是添加select *到## pivoted我得到以下錯誤:一個對象或列名缺失或空。對於SELECT INTO語句,請確認每列都有一個名稱。對於其他語句,查找空的別名。別名定義爲「」或[]是不允許的。將別名更改爲有效的名稱。 – Erik