Запрос Sql для представления пустых строк - PullRequest
0 голосов
/ 11 февраля 2019

У меня есть простая таблица:

Table: pn
id, vender, article, sells, date
01, Peter, bread, 10, 02-01-2019
02, Tom, bread, 3, 10-01-2019
03, Paul, water, 3, 05-01-2019
04, Peter, oil, 5, 16-01-2019
05, Paul, bread, 1, 22-01-2019
06, Tom, oil, 2, 30-01-2019
07, Peter, bread, 1, 27-01-2019
08, Tom, oil, 1, 17-01-2019

Мне нужен запрос, который будет возвращать продажи каждого продавца, для определенных товаров, за определенный период времени.Пример: хлеб и масло в период с 01-01-2019 по 31-01-2019.Результат запроса должен выглядеть следующим образом:

Vendor, Article, Sells
Paul, bread, 1
Paul, oil, 0
Peter, bread, 11
Peter, oil, 5
Tom, bread, 3
Tom, oil, 3

Моя проблема в том, что некоторые поставщики не продают определенные статьи, строки для этого поставщика / статьи не печатаются, например:

Vendor, Article, Sells
Paul, bread, 1
Peter, bread, 11
Peter, oil, 5
Tom, bread, 3
Tom, oil, 3

Обратите внимание на пропущенное "Paul, oil, 0"

Мой текущий код выглядит следующим образом:

SELECT pn.vendor, pn.article, SUM (pn.sells)
FROM pn
WHERE pn.date BETWEEN  01.01.2019 AND 31.01.2019
   AND (pn.article = 'bread' OR pn.article = 'oil')   
GROUP BY pn.vendor, pn.article
ORDER BY pn.vendor ASC, pn.article ASC

Я перепробовал множество разных aproches с ISNULL и COALESC, но безуспешно.Любая помощь приветствуется.

Спасибо.

Ответы [ 2 ]

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

Пропустите предложение WHERE, чтобы получить Пола тоже.Затем используйте выражение case для условного агрегирования:

SELECT pn.vendor, pn.article,
        SUM (case when pn.date BETWEEN  01.01.2019 AND 31.01.2019
                       and AND (pn.article = 'bread' OR pn.article = 'oil')  then pn.sells
                  else 0 end)
FROM pn
GROUP BY pn.vendor, pn.article
ORDER BY pn.vendor ASC, pn.familia ASC
0 голосов
/ 11 февраля 2019

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

SELECT v.vendor, a.article, COALESCE(SUM(pn.sells), 0)
FROM (SELECT DISTINCT vendor FROM pn) v CROSS JOIN
     (SELECT DISTINCT article FROM pn) a LEFT JOIN
     pn
     ON pn.vendor = v.vendor AND
        pn.article = a.article AND
        pn.date >= '2019-01-01' AND
        pn.date < '2019-02-01' 
WHERE a.article IN ('bread', 'oil')   
GROUP BY v.vendor, a.article
ORDER BY v.vendor ASC, a.article ASC;

Примечания:

  • Используйте стандартные форматы даты для ваших дат(YYYY-MM-DD является стандартным стандартом SQL и стандартом ISO 8601).
  • Использование псевдонимов таблиц определяет все ссылки на столбцы.
  • Я понятия не имею, что такое familia в ORDER BY.
  • В большинстве баз данных вы можете просто перечислить нужные статьи в качестве производной таблицы для a.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...