Отображение результатов для фиксированных значений в SQL - PullRequest
0 голосов
/ 22 марта 2020

У меня возникли проблемы с решением приведенной ниже проблемы:

У меня есть таблица, в которой указан идентификатор магазина, дата, время, категория и сумма продаж.

shopid   date     hour      category  amount
    ------------------------------------
    1    date1    7          food       10
    1    date1    8          food       15
    1    date1    10         misc.      5
    2    date1    7          food       6
    ...................................

Я пытаюсь рассчитать общую сумму продаж за каждый час по категориям продуктов питания и отображаю следующее:

shopid  category     hour        amount
    ------------------------------------
    1       food      6             0
    1       food      7             5
    1       food      8             20
    2       food      9             40
    ...................................

Часы работы магазинов с 6 утра до 10 вечера. , Так что за каждый час могут быть какие-то продажи или нет. Я смог выполнить почасовое суммирование. Но я не могу отобразить ноль и время, когда нет продаж в конкретное время (например, 6 часов утра или любое другое время между часами работы) для каждой категории продаж.

Ответы [ 2 ]

0 голосов
/ 22 марта 2020

Я пытаюсь рассчитать общий объем продаж за каждый час по категориям продуктов питания.

Это имеет смысл, но не имеет смысла включать shopid в результаты.

Чтобы сделать это, вам нужно сгенерировать строки - все часы и категории продуктов. Затем введите фактические результаты, используя left join:

select c.category. g.hour, coalesce(sum(s.amount), 0)
from generate_series(6, 22) g(hour) cross join
     (select distinct category from sales) c left join
     sales s
     on s.hour = g.hour and s.category = c.category
group by c.category, g.hour
order by c.category, g.hour;

Если вам нужны результаты по магазинам / категориям / часам, вы можете использовать ту же идею:

select sh.shopid, c.category. g.hour,
       coalesce(sum(s.amount), 0)
from generate_series(6, 22) g(hour) cross join
     (select distinct category from sales) c cross join
     (select distinct shopid from sales) sh left join
     sales s
     on s.shopid = sh.shopid and
        s.hour = g.hour and
        s.category = c.category
group by sh.shopid, c.category, g.hour
order by sh.shopid, c.category, g.hour;
0 голосов
/ 22 марта 2020

Использовать левое объединение со списком часов:

select t.shopid, t.category. g.hour, sum(t.amount)
from generate_series(6,22) as g(hour)
  left join the_table t on t.hour = g.hour
group by t.shopid, t.category, g.hour
order by t.shopid, t.category, g.hour;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...