GROUP BY操作的默认值

时间:2019-03-03 19:41:09

标签: sql postgresql

我想使用下一个查询来计算某些项目组的平均值

SELECT g.id, i.metric, AVG(i.value) FROM items_group g
  JOIN items i ON i.group_id=g.id
GROUP BY g.id, i.metric

但是此查询未在结果中包含空组。我希望这些组的值为0,这表明一组指标是固定的(价格,长度,重量)。非空组1和空组2的所需输出为

group_id|metric|value
__________________________
1       |price |5
1       |length|33
1       |weight|10
2       |price |0
2       |length|0
2       |weight|0

2 个答案:

答案 0 :(得分:0)

您可以使用LEFT JOIN

SELECT g.id, i.metric, AVG(i.value) 
FROM items_group g
LEFT JOIN items i ON i.group_id=g.id
GROUP BY g.id, i.metric

答案 1 :(得分:0)

这有点复杂,因为您需要生成原始数据中不存在的行。

使用cross join生成行。然后使用left join引入值:

SELECT ig.id, m.metric, AVG(i.value)
FROM items_group ig CROSS JOIN
     (SELECT DISTINCT i.metric FROM items i) m LEFT JOIN
     items i
     ON i.group_id = ig.id AND i.metric = m.metric
GROUP BY ig.id, m.metric;

如果您有单独的指标表,则可以使用它代替m的子查询。