2013-11-04 21 views
0

我有三個表(有關列如下圖所示)從第一個表中的所有值,即使沒有其它表

表SALESSaleCodes

配襯
"SaleCode" VARCHAR(2) COLLATE "ANSI" DEFAULT '', 
"Description" VARCHAR(25) COLLATE "ANSI" DEFAULT '' 

表INVOIHeader

"DocNum" INTEGER DEFAULT 0, 
"AcctDate" DATE 

表INVOItems

"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中的所有salecodes和我試圖獲得的各列,包括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,它是不是給我所有的SaleCodes從SALESSaleCodes。

無論是否在這個範圍內,我需要什麼聲明才能獲得所有的銷售代碼,並且只有在該日期範圍內的總計和計數。其他總和和計數將是NULL。

我正在使用SQL 2003標準(ANSI ISO/IEC 9075:2003)的ElevateDB。我知道你們大多數人是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 
    ) 
... 
+0

謝謝,一旦我看到它就顯得很明顯。 – Phil

相關問題