Значения по умолчанию для ГРУППЫ ПО операциям

#sql #postgresql

#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
  

Ответ №1:

Вы могли бы использовать 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
  

Ответ №2:

Это немного сложно, потому что вам нужно сгенерировать строки, которых нет в исходных данных.

Используйте 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 .