我有以下查询来收集报告的数据:
SELECT COUNT(*) as inspected,
count(*) filter(where status='fail') as failed,
count(*) filter(where status='deficient') as impaired,
count(*) filter(where status='pass') as passed,
device_types.name
FROM inspection_data
INNER JOIN devices ON devices.id=inspection_data.device_id
INNER JOIN device_types ON devices.device_type_id=device_types.id
WHERE inspection_id = 3
GROUP BY device_types.id
ORDER BY device_types.name
此查询正在按预期工作(虽然我确定可以稍微优化.SQL不是我的强项)。问题是我现在想要再收集一个汇总数据。我想计算device_id的设备表中每个device_type_id的数量。
我会尝试映射数据库表:
| devices | device_types | inspection_data |
|:--------------:|:------------:|:---------------:|
| id | id | id |
| device_type_id | name | inspection_id |
| location_id | | device_id |
| | | status |
因此,当我运行查询时,我收到的结果与此类似:
| inspected | failed | impaired | passed | name |
|:---------:|:------:|:--------:|--------|----------------------------|
| 6 | 0 | 2 | 4 | Air Sampling Type Detector |
| 9 | 1 | 1 | 7 | Alarm Bell |
这很棒。我的意思是,在检查过程中不一定要检查所有位置的设备。例如,让我们说实际上有15"警钟"这个位置的设备,但根据上表,只有9个作为检查的一部分进行了检查。如何在此输出中包含另一列,名为" total"报警铃设备类型的值为15,对报告中的每种设备类型都是如此?
我希望我已经充分描述了我想要做的事情。我完全不知道如何在不进行第二次查询的情况下解决这个问题,除非绝对必要,否则我真的不想这样做,因为它会使代码更加混乱。
答案 0 :(得分:0)
我想你想要left join
。但是,我不确定哪个表首先出现。我最好的猜测是:
SELECT COUNT(*) as total,
COUNT(id.device_id) as inspected,
COUNT(id.device_id) filter (where status='fail') as failed,
COUNT(id.device_id) filter (where status='deficient') as impaired,
COUNT(id.device_id) filter (where status='pass') as passed,
dt.name
FROM devices d INNER JOIN
device_types dt
ON d.device_type_id = dt.id LEFT JOIN
inspection_data id
ON d.id = id.device_id AND
id.inspection_id = 3
GROUP BY dt.id
ORDER BY dt.name