SQL将1个字段,多个记录转换为1个记录多个字段

如果我更有经验,我可以使用类似的“合并行”问题来解决这个问题,但我无法让它们发挥作用.我在某些类别的accdb中有大约2000个“车库”(实际上有患者数据的诊所,但在此简化).以下是一个车库数据存在的示例:

Garage ID   Car_Color        Sub_Type?   Color_Count
    42       Blue            Striped        5
    42       Blue                           10
    42       Red                            23
    42       Yellow                         2

我需要将每个车库变成一个单独的记录,每种颜色作为一个单独的字段,计数,所需的输出显示在这里:

Garage ID   Blue Cars (total)  Blue Cars (striped)   Red Cars  Yellow Cars   Orange Cars
    42         15                    5                  23          2             0

有一个子类型,这里显示为“蓝色汽车”和“蓝色汽车(条纹)”.对于那些,我需要将没有子类型的“蓝色”计数与另一个“蓝色”计数相加以得到总“蓝色”计数.然后我会将Blue子类型列为单独的字段.大多数车库都没有列出橙色汽车,因此当没有橙色汽车记录时,我需要让该记录显示该字段为0,但如果有记录,则反映计数.

这似乎与其他自联接非常相似,但是我无法使计数方面起作用,或者“0”没有记录.

最佳答案
您可以将聚合函数与IIF()表达式一起使用:

select [Garage ID],
  sum(IIF(Car_color='Blue', Color_Count, 0)) as BlueCarsTotal,
  sum(IIF(Car_color='Blue' AND [Sub_Type?]='Striped', Color_Count, 0)) as BlueCarsStripedTotal,
  sum(IIF(Car_color='Red', Color_Count, 0)) as RedCarsTotal,
  sum(IIF(Car_color='Yellow', Color_Count, 0)) as YellowCarsTotal,
  sum(IIF(Car_color='Orange', Color_Count, 0)) as OrangeCarsTotal
from yourtable
group by [Garage ID]

如果您在允许CASE表达式的另一个数据库中执行此操作,则查询将是:

select [Garage ID],
  sum(case 
       when Car_color='Blue' 
       then Color_Count else 0 end) as BlueCarsTotal
  sum(case 
       when Car_color='Blue' AND [Sub_Type?]='Striped' 
       then Color_Count else 0 end) as BlueCarsStripedTotal,
  sum(case 
       when Car_color='Red' 
       then Color_Count else 0 end) as RedCarsTotal,
  sum(case 
       when Car_color='Yellow' 
       then Color_Count else 0 end) as YellowCarsTotal,
  sum(case 
       when Car_color='Orange' 
       then Color_Count else 0 end) as OrangeCarsTotal
from yourtable
group by [Garage ID]

转载注明原文:SQL将1个字段,多个记录转换为1个记录多个字段 - 代码日志