计算相关表

时间:2016-08-10 02:36:48

标签: postgresql

我有以下查询来收集报告的数据:

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,对报告中的每种设备类型都是如此?

我希望我已经充分描述了我想要做的事情。我完全不知道如何在不进行第二次查询的情况下解决这个问题,除非绝对必要,否则我真的不想这样做,因为它会使代码更加混乱。

1 个答案:

答案 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