SQL: PostgresSQL с группой по двум столбцам и avg - как показать все группы, даже если среднее значение равно нулю - PullRequest
0 голосов
/ 28 апреля 2019

У меня есть следующая таблица:

CREATE TABLE table1
    ("id" int, "day" varchar(8), "customer" varchar(1), "amount" int)
;


INSERT INTO Table1
    ("id", "day", "customer", "amount")
VALUES
    (1, 'Thursday', 'a', 10),
    (2, 'Thursday', 'a', 11),
    (3, 'Thursday', 'b', 12),
    (4, 'Friday', 'c', 13),
    (5, 'Friday', 'c', 14),
    (6, 'Saturday', 'c', 15),
    (7, 'Saturday', 'a', 16),
    (8, 'Saturday', 'c', 17),
    (9, 'Saturday', 'c', 18),
    (10, 'Saturday', 'a', 19)
;

И мне нужно иметь среднюю сумму для каждой комбинации день-клиент (3x3 = 9 строк). Однако, когда я использую этот следующий простой запрос, дни, когда конкретный клиент не потратил деньги, не отображаются. Я хотел бы, чтобы они были включены и показывали в среднем ноль.

Запрос:

Select day, customer, avg(amount) 
FROM table1
GROUP BY day, customer 

Результат:

+-----------+-----------+---------------------+
|   day     | customer  |         avg         |
+-----------+-----------+---------------------+
| Friday    | c         | 13.5000000000000000 |
| Saturday  | c         | 16.6666666666666667 |
| Thursday  | b         | 12.0000000000000000 |
| Thursday  | a         | 10.5000000000000000 |
| Saturday  | a         | 17.5000000000000000 |
+-----------+-----------+---------------------+

Желаемый результат:

+----------+----------+------------------+
|   day    | customer |       avg        |
+----------+----------+------------------+
| Friday   | a        | 0                |
| Friday   | b        | 0                |
| Friday   | c        | 13.5             |
| Saturday | a        | 17.5             |
| Saturday | b        | 0                |
| Saturday | c        | 16.6666666666667 |
| Thursday | a        | 10.5             |
| Thursday | b        | 12               |
| Thursday | c        | 0                |
+----------+----------+------------------+

Fiddle: [https://www.db -fiddle.com / f / gT5FoFbvC951CHdFXBsfYH / 0] [1] Буду признателен за любую оказанную помощь.

1 Ответ

1 голос
/ 28 апреля 2019

Используйте cross join для генерации строк и left join для ввода значений:

select d.day, c.customer, coalesce(avg(t.amount), 0)
from (select distinct day from table1) d cross join
     (select distinct customer from table1) c left join
     table1 t
     on t.day = d.day and t.customer = c.customer
group by d.day, c.customer;

Если у вас есть другие источники информации о клиентах или днях, вы можете использовать их вместо подзапросов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...