2015-01-13 2 views
6

У меня есть таблица отображения от одного до многих, отображаемая ниже. Мне нужно отобразить 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). Как я могу изменить код для отображения ICD10 для каждого ICD9 в столбце?

+0

Если вы пытаетесь повернуть 12000 столбцов, вы не сможете. Я бы предложил посмотреть на что-то внутри вашего приложения, а не на SQL. Каково максимальное количество 'icd10', которое вы будете иметь для каждого' icd9'? – Taryn

ответ

5

На основе вашего текущего кода вы преобразуете все значения 12000 в столбец ICD10 в новые столбцы. Это слишком много столбцов и совершенно неуправляемо для любого пользователя.

Похоже, что вы действительно хотите преобразовать значение ICD10, связанное с ICD9 в новые столбцы. Для этого вам нужно будет использовать функцию окон, например 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 | 

Теперь у вас есть новый столбец, который содержит rn количество ICD10 значений для каждого ICD9. Этот новый столбец будет использоваться в своде для создания новых столбцов. Если у вас есть ограниченное количество столбцов, то вы можете жестко закодировать запрос:

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. Теперь, если вы не знаете, сколько всего ICD10 элементов, которые у вас есть для каждого ICD9, вам придется использовать динамический 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 столбцов.

Смежные вопросы