私は3つのテーブルを持っています(以下に関連する列を示します)
テーブル 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
SALESaleCodes 内のすべてのセールコードと、カウントがゼロで合計が 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
私が必要としているのは、その日付が 2 つの指定された日付の間にある 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 のユーザーであることは知っていますが、ここで質問して、皆さんが何を思いつくか見てみようと思いました。