2015-01-13 4 views
6

Ich habe eine Eins-zu-viele-Mapping-Tabelle wie folgt angezeigt. Ich muss die ICD10 HORIZONTALLY anzeigen. für jede ICD9. Die Daten sind dynamisch, daher kann ich die statische Pivot-Funktion nicht verwenden.Horizontale bis vertikale Anzeige mit dynamischer Pivot-Funktion

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

möchte ich das Ergebnis as-

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

Zur Zeit habe ich versucht, diesen Code zu verwenden:

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) 

aber es funktioniert nicht, wie ich zu viele Datensätze haben (ungefähr 12000). Wie kann ich den Code ändern, um die ICD10 für jede ICD9 in einer Spalte anzuzeigen?

+0

Wenn Sie versuchen, 12000 Spalten zu schwenken, werden Sie nicht in der Lage sein. Ich würde vorschlagen, etwas in Ihrer Anwendung statt in SQL zu tun. Was ist die maximale Anzahl von 'icd10', die du für jedes' icd9' haben wirst? – Taryn

Antwort

5

Basierend auf Ihrem aktuellen Code konvertieren Sie alle 12000 Werte in der Spalte ICD10 in neue Spalten. Das sind viel zu viele Spalten und für jeden Benutzer völlig unüberschaubar.

Es scheint, dass Sie wirklich jeden ICD10 Wert, der mit ICD9 verknüpft ist, in neue Spalten konvertieren möchten. Dazu müssen Sie eine Fensterfunktion wie row_number() verwenden und einen eindeutigen Wert für jede ICD10 erstellen, die als neue Spaltennamen verwendet wird.

Ihre Anfrage wird mit so etwas wie:

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

Demo See. Daraus ergibt sich ein Ergebnis:

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

Sie jetzt eine neue Spalte rn haben, die die Anzahl der ICD10 Werte für jede ICD9 enthält. Diese neue Spalte wird im Pivot verwendet, um Ihre neuen Spalten zu erstellen. Wenn Sie eine begrenzte Anzahl von Spalten haben, dann können Sie hart, um die Abfrage-Code:

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 See. Jetzt, wenn Sie nicht wissen, wie viele insgesamt ICD10 Elemente, die Sie für jede ICD9 haben würden, müssen Sie dynamische SQL verwenden. Sie würden Sie den Code in Ihrer ursprünglichen Abfrage ändern, um zu sein:

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; 

Siehe SQL Fiddle with Demo. Diese geben ein Endergebnis von:

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

Jetzt können Sie die Namen der letzten Spalten ändern, um alles, was Sie brauchen, aber das sollte Ihnen das Ergebnis, das Sie wollen, ohne 12000 Spalten zu schaffen.

Verwandte Themen