3

如果我更有经验,我可以使用类似的“合并行”问题来解决这个问题,但我无法让它们起作用。我在 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”。

4

2 回答 2

5

您可以将聚合函数与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]
于 2013-03-18T22:50:29.933 回答
3

A crosstab may suit:

TRANSFORM Sum(Garages.Color_Count) AS SumOfColor_Count
SELECT Garages.GarageID
FROM Garages
GROUP BY Garages.GarageID
PIVOT [Car_Color] & " " & [sub_type?];
于 2013-03-18T23:09:34.110 回答