非规范化结果集

时间:2014-09-19 17:09:59

标签: sql-server-2008 denormalized

我试图对结果集进行非规范化,以便每个ID都有一条记录。这是一份患有多种合并症的患者名单。目前的数据如下:

ID  Disease
1   Asthma  
1   Cancer
1   Anemia
2   Asthma  
2   HBP

我需要它看起来像这样:

ID  Disease1    Disease2    Disease3
1   Asthma      Cancer      Anemia
2   Asthma      HBP         <NULL or Blank>

我研究了Pivot,但我看到的所有例子都使用了不适用的聚合函数。 我添加了row_number函数并尝试了以下自连接:

case when rownum = 1 then Disease else NULL end Disease1,
case when rownum = 2 then Disease else NULL end Disease2,
case when rownum = 3 then Disease else NULL end Disease3

但是,这会产生以下结果:

ID  Disease1    Disease2    Disease3
1   Asthma      NULL        NULL
1   NULL        Cancer      NULL
1   NULL        NULL        Anemia
2   Asthma      NULL        NULL
2   NULL        HBP         NULL

任何建议都将不胜感激。我真的想找到一种方法来实现这一目标,而不需要一个可怕的代码块(这是我在尝试时最终得到的)。谢谢!

1 个答案:

答案 0 :(得分:1)

您可以使用MAX压缩行:

select 
    id, 
    max(case when rownum = 1 then Disease end) Disease1,
    max(case when rownum = 2 then Disease end) Disease2,
    max(case when rownum = 3 then Disease end) Disease3
from (
    select 
    id, 
    disease, 
    rownum =  ROW_NUMBER() OVER (partition by id order by id) 
    from your_table 
) sub
group by id

Sample SQL Fiddle