Все значения из первой таблицы, даже если в других таблицах ничего не совпадает
У меня есть три таблицы (показаны ниже с соответствующими столбцами)
Таблица SALESSaleCodes
"SaleCode" VARCHAR(2) COLLATE "ANSI" DEFAULT '',
"Description" VARCHAR(25) COLLATE "ANSI" DEFAULT ''
Таблица INVOIHeader
"DocNum" INTEGER DEFAULT 0,
"AcctDate" DATE
Таблица INVOIItems
"DocNum" INTEGER DEFAULT 0,
"SaleCode" VARCHAR(2) COLLATE "ANSI" DEFAULT '',
"Cost" DECIMAL(19,2) DEFAULT 0.00,
"SellPrice" DECIMAL(19,2) DEFAULT 0.00,
"LaborEach" DECIMAL(19,2) DEFAULT 0.00,
"QtySold" DECIMAL(19,2) DEFAULT 0.00
Я написал это заявление, которое возвращает все коды продажи в SALESSaleCodes и соответствующие столбцы, которые я пытаюсь получить, включая те, где count равен нулю, а суммы равны NULL.
SELECT a.SaleCode, a.Description, COUNT(b.SaleCode) AS Count, SUM(b.SellPrice * b.QtySold) AS Parts,
SUM(b.LaborEach * b.QtySold) AS Labor, SUM(b.Cost * b.QtySold) AS Cost
FROM SALESSaleCodes a
LEFT JOIN INVOIItems b ON a.SaleCode = b.SaleCode
GROUP BY a.SaleCode
ORDER BY a.SaleCode
Что мне нужно, это тот, который учитывает AcctDate от INVOIHeader, где эта дата находится между двумя указанными датами.
Я пробовал это
SELECT a.SaleCode, a.Description, COUNT(b.SaleCode) AS Count, SUM(b.SellPrice * b.QtySold) AS Parts,
SUM(b.LaborEach * b.QtySold) AS Labor, SUM(b.Cost * b.QtySold) AS Cost
FROM SALESSaleCodes a
LEFT JOIN INVOIItems b ON a.SaleCode = b.SaleCode
LEFT JOIN INVOIHeader c ON b.DocNum = c.DocNum
WHERE c.AcctDate BETWEEN
CAST('2013-10-01' AS DATE) AND
CAST('2013-10-31' AS DATE)
GROUP BY b.SaleCode
ORDER BY b.SaleCode
Но это возвращает только SaleCodes, попадающие в этот диапазон, и он не дает мне все SaleCodes из SALESSaleCodes .
Какое утверждение мне нужно, чтобы получить все SaleCodes, находятся ли они в этом диапазоне или нет, и только суммы и числа, которые находятся в этом диапазоне дат. Другие суммы и числа будут NULL.
Я работаю в ElevateDB, который использует стандарт SQL 2003 (ANSI ISO/IEC 9075:2003). Я знаю, что большинство из вас - пользователи Oracle, SQLServer или MySQL, но я решил спросить здесь и посмотреть, что вы, ребята, могли бы придумать.
1 ответ
...
WHERE (
(c.AcctDate BETWEEN CAST('2013-10-01' AS DATE) AND CAST('2013-10-31' AS DATE))
OR c.AcctDate IS NULL
)
...