2015-01-13 11 views
6

Ho una tabella di mappatura da uno a molti visualizzata come di seguito. Devo visualizzare lo ICD10 ORIZZONTALMENTE. per ogni ICD9. I dati sono dinamici quindi non posso usare la funzione di pivot statico.Visualizzazione orizzontale a verticale mediante la funzione di rotazione dinamica

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

voglio il risultato da visualizzare AS

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

Attualmente ho provato ad usare questo codice:

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) 

ma non funziona come ho troppi record (circa 12000). Come posso modificare il codice per visualizzare ICD10 per ogni ICD9 in una colonna?

+0

Se si sta tentando di ruotare 12000 colonne, non sarà possibile. Suggerirei di cercare di fare qualcosa all'interno dell'applicazione anziché in SQL. Qual è il numero massimo di 'icd10' che avrai per ogni' icd9'? – Taryn

risposta

5

In base al codice corrente, si convertono tutti i 12000 valori nella colonna ICD10 in nuove colonne. Sono troppe colonne e completamente ingestibili per qualsiasi utente.

Sembra che tu voglia veramente convertire ogni valore ICD10 associato a ICD9 in nuove colonne. Per fare ciò, è necessario utilizzare una funzione di windowing come row_number() e creare un valore univoco per ogni ICD10 che verrà utilizzato come nuovo nome di colonna.

vostra query utilizzando qualcosa di simile:

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

Vedi Demo. Questo dà un risultato:

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

Si dispone ora di una nuova colonna rn che contiene il numero di ICD10 valori per ogni ICD9. Questa nuova colonna verrà utilizzata nel pivot per creare le nuove colonne. Se si dispone di un numero limitato di colonne, allora si può codificare la query:

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; 

Vedi SQL Fiddle with Demo. Ora se non sai quanti articoli totali ICD10 avresti per ogni ICD9 dovrai utilizzare l'SQL dinamico. Faresti modificare il vostro codice nel tuo query originale per essere:

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; 

Vedi SQL Fiddle with Demo. Questi danno un risultato finale di:

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

Ora è possibile modificare i nomi delle colonne finali a tutto ciò che è necessario, ma questo dovrebbe darvi il risultato che si desidera senza creare 12000 colonne.

Problemi correlati