![](/img/trans.png)
[英]Join two tables. Select all rows from one table and only matching values from other table?
[英]All values from first table, even if nothing matchs on other tables
我有三個表(如下所示,帶有相關的列)
表SALESSaleCodes
"SaleCode" VARCHAR(2) COLLATE "ANSI" DEFAULT '',
"Description" VARCHAR(25) COLLATE "ANSI" DEFAULT ''
表INVOIHeader
"DocNum" INTEGER DEFAULT 0,
"AcctDate" DATE
表INVOI項目
"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中的所有salecode和我嘗試獲取的相應列,包括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
我需要的是考慮到INVOIHeader中AcctDate的日期,該日期介於兩個給定日期之間。
我試過了
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,並沒有給我SALESSaleCodes提供的所有SaleCodes。
無論它們是否在此范圍內,並且僅在該日期范圍內的總和和計數,我都需要什么語句來獲取所有SaleCode。 其他總和為NULL。
我正在使用SQL 2003標准(ANSI ISO / IEC 9075:2003)的ElevateDB中工作。 我知道你們中的大多數都是Oracle,SQLServer或MySQL用戶,但我想我會在這里問一下,看看你們能想到什么。
...
WHERE (
(c.AcctDate BETWEEN CAST('2013-10-01' AS DATE) AND CAST('2013-10-31' AS DATE))
OR c.AcctDate IS NULL
)
...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.