2015-01-13 5 views
6

以下のように1対多のマッピングテーブルが表示されています。私はICD10ホライズンを表示する必要があります。各ICD9の データは動的なので、私は静的なピボット関数を使用することはできません。ダイナミックピボット関数を使用した水平から垂直への表示

私は結果が

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

現在、私はこのコードを使用しようとしたAS-表示させたい

ICD9 | ICD10 
-----+------ 
0156 | 0178 
0156 | 0179 
| 0181 
0152 | 0202 
0231 | 0210 
0231 | 0211 
0231 | 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を持って

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

:これは、結果を提供します。この新しい列は、新しい列を作成するためにピボットで使用されます。あなたは、列の数が限られている場合は、ハードのクエリを記述することができます

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ごとにどれくらい多くのアイテムを持っているのかがわからない場合は、動的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を参照してください。今、あなたは何が必要に最終列の名前を変更することができますが、これはあなたが12000個の列を作成することなく、欲しい結果を与える必要があります

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

:これらは、最終的な結果を与えます。

関連する問題