0

我有三个表(如下所示的相关列)

表销售代码

"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 中的所有销售代码以及我试图获取的相应列,包括那些计数为零且总和为 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 。

我需要什么语句来获取所有销售代码,无论它们是否在此范围内,并且只有在此日期范围内的总和和计数。其他总和和计数将为 NULL。

我在使用 SQL 2003 标准(ANSI ISO/IEC 9075:2003)的 ElevateDB 工作。我知道你们中的大多数人是 Oracle、SQLServer 或 MySQL 用户,但我想我会在这里问一下,看看你们能想出什么。

4

1 回答 1

1
...    
    WHERE (
      (c.AcctDate BETWEEN CAST('2013-10-01' AS DATE) AND CAST('2013-10-31' AS DATE))
      OR c.AcctDate IS NULL
    )
...
于 2013-11-04T21:12:28.540 回答