Построение отчета с пробелами - PullRequest
0 голосов
/ 13 февраля 2019

Мне нужно составить отчет о продажах продавца за определенный промежуток времени.У меня проблема в том, что в отчете также должны быть указаны продавцы, которые не делали продаж в этот день.

Продавцы (таблица)

id | name
----------
 1 | John
 2 | Tom

Продажи (таблица)

id | vendor_id |    date        | status | price
------------------------------------------------
 1 |        1  |    2019-01-01  |    0   | 100
 2 |        1  |    2019-01-01  |    0   | 100 
 3 |        2  |    2019-01-01  |    0   | 100
 4 |        2  |    2019-01-02  |    0   | 100 

Требуемый отчет: общий объем продаж между 2019-01-01 и 2019-01-04

date        |vendor| total
--------------------------
2019-01-01  | John | 200
2019-01-01  | Tom  | 100
2019-01-02  | John | 0
2019-01-02  | Tom  | 100
2019-01-03  | John | 0
2019-01-03  | Tom  | 0
2019-01-04  | John | 0
2019-01-04  | Tom  | 0

Для генерации последовательности дней IЯ использую генератор даты здесь

И когда я пересекаю (левое объединение) даты, сгенерированные с помощью sales, я получаю следующее:

SELECT date_generator.daily_date, vendors.name, sales.price
        FROM ( 
            SELECT DATE_ADD(@startDate, INTERVAL (@i:=@i + 1) - 1 DAY) AS daily_date   
            FROM information_schema.columns, (SELECT @i:=0) gen_sub   
            WHERE DATE_ADD(@startDate, INTERVAL @i DAY) BETWEEN @startDate AND @endDate 
        ) date_generator 
        LEFT JOIN sales ON DATE(sales.date) = DATE(date_generator.daily_date)
        LEFT JOIN vendors ON vendors.id = sales.vendor_id
ORDER BY date_generator.daily_date

date        |vendor| price
--------------------------
2019-01-01  | John | 100
2019-01-01  | John | 100
2019-01-01  | Tom  | 100
2019-01-02  | Tom  | 100
2019-01-03  | null | null
2019-01-04  | null | null

МожетВы даете мне хитрость, чтобы получить группировку поставщиков и даты?

1 Ответ

0 голосов
/ 13 февраля 2019

Поскольку в некоторые дни нет продаж, у вас будет значение NULL sales.vendor.id, поэтому ничего не будет равно JOIN до vendors.Чтобы убедиться, что вы получаете всех поставщиков на все даты, вам нужно сделать CROSS JOIN от date_generator до vendors, а затем LEFT JOIN для продаж.Затем вам нужно взять SUM из sales.price и GROUP BY дату и поставщика, чтобы получить желаемый результат:

SELECT date_generator.daily_date, vendors.name, SUM(sales.price)
        FROM ( 
            SELECT DATE_ADD(@startDate, INTERVAL (@i:=@i + 1) - 1 DAY) AS daily_date   
            FROM information_schema.columns, (SELECT @i:=0) gen_sub   
            WHERE DATE_ADD(@startDate, INTERVAL @i DAY) BETWEEN @startDate AND @endDate 
        ) date_generator 
        CROSS JOIN vendors
        LEFT JOIN sales ON DATE(sales.date) = DATE(date_generator.daily_date) AND vendors.id = sales.vendor_id
GROUP BY date_generator.daily_date, vendors.name
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...