2015-01-13 52 views
6

我有一對多的映射表,如下所示。我需要顯示HORIZONTALLY的ICD10。 每個ICD9。數據是動態的,因此我不能使用靜態透視功能。使用動態樞軸功能的水平垂直顯示

ICD9 | ICD10 
-----+------ 
0156 | 0178 
0156 | 0179 
| 0181 
0152 | 0202 
0231 | 0210 
0231 | 0211 
0231 | 0212 

我要顯示原樣

ICD9 | ICD10 | ICD10 | ICD10 
0156 | 0178 | 0179 | null 
| 0181 | null | null 
0152 | 0202 | null | null 
0231 | 0210 | 0211 | 0212 

目前,我試圖用這個代碼的結果:

DECLARE @cols AS NVARCHAR(MAX), 
    @query AS NVARCHAR(MAX) 

SET @cols = STUFF((SELECT distinct ',' + QUOTENAME(icd10) 
      FROM mv_icd 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 

set @query = 'SELECT icd9, ' + @cols + ' from 
      (
       select icd9,icd10 from mv_icd 
      ) x 
      pivot 
      (
       min(icd9) 
       for icd10 in (' + @cols + ') 
      ) p ' 
      execute(@query) 

但因爲我有太多的記錄,這是行不通的(約12000)。如何更改代碼以在列中顯示每個ICD9ICD10

+0

如果您試圖旋轉12000列,您將無法使用。我建議你在應用程序內部而不是SQL中進行一些操作。每個'icd9'都有多少'icd10'? – Taryn

回答

5

根據您當前的代碼,您將ICD10列中的所有12000個值轉換爲新列。這對於任何用戶來說都是太多的列,並且完全無法管理。

看來您確實想要將與ICD9關聯的每個ICD10值轉換爲新列。要做到這一點,您需要使用像row_number()這樣的窗口功能,併爲每個ICD10創建一個唯一值作爲新列名稱。

您的查詢就會使用類似:

select icd9, icd10, 
    rn = row_number() over(partition by icd9 order by icd10) 
from mv_icd 

Demo。這給出了一個結果:

| ICD9 | ICD10 | RN | 
|------|-------|----| 
| 123 | 181 | 1 | 
| 152 | 202 | 1 | 
| 156 | 178 | 1 | 
| 156 | 179 | 2 | 
| 231 | 210 | 1 | 
| 231 | 211 | 2 | 
| 231 | 212 | 3 | 

您現在有一個包含ICD10值的每個ICD9數的新列rn。這個新列將用於數據透視表來創建新列。如果你有列的數量有限,那麼你可以硬編碼查詢:

select icd9, [1], [2], [3] 
from 
(
    select icd9, icd10, 
    rn = row_number() over(partition by icd9 order by icd10) 
    from mv_icd 
) d 
pivot 
(
    max(icd10) 
    for rn in ([1], [2], [3]) 
) piv; 

SQL Fiddle with Demo。現在,如果您不知道每個ICD9需要使用多少個ICD10項,則必須使用動態SQL。您將在原始查詢中更改您的代碼:

DECLARE @cols AS NVARCHAR(MAX), 
    @query AS NVARCHAR(MAX) 

-- get list of the unique # of ICD10's per ICD9 
SET @cols = STUFF((SELECT ',' + QUOTENAME(rn) 
      FROM 
      (
       SELECT rn = row_number() over(partition by icd9 order by icd10) 
       FROM mv_icd 
      ) d 
      GROUP BY rn 
      ORDER BY rn 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 

set @query 
     = 'SELECT icd9, ' + @cols + ' 
      from 
      (
      select icd9, icd10, 
       rn = row_number() over(partition by icd9 order by icd10) 
      from mv_icd 
      ) x 
      pivot 
      (
      max(icd10) 
      for rn in (' + @cols + ') 
      ) p ' 

exec sp_executesql @query; 

請參閱SQL Fiddle with Demo。這些給的最終結果:

| ICD9 | 1 |  2 |  3 | 
|------|-----|--------|--------| 
| 123 | 181 | (null) | (null) | 
| 152 | 202 | (null) | (null) | 
| 156 | 178 | 179 | (null) | 
| 231 | 210 | 211 | 212 | 

現在你可以改變任何你需要的最後列的名稱,但是這應該給你,你想不創建12000列的結果。