2012-01-17 7 views
2

sales.quantityの合計を週別に要約し、売上がなくても週数を表示したい。空白行の場合でも週別に集計する

すべての週番号を強制的に強制するために外部結合を使用するためにそこに1-54の週テーブルをセットアップしましたが、それは機能しません。それは売り上げがなかった週を欠場する。

私のクエリは次のとおりです。

SELECT Weeks.WeekNum, SUM(sales.quantity) AS sales 
FROM Weeks LEFT OUTER JOIN 
    sales ON Weeks.WeekNum = DATEPART(week, sales.transDate) 
WHERE (sales.transDate BETWEEN @fromDate AND @toDate) 
GROUP BY Weeks.WeekNum 

すべてのヘルプは大幅に受信されるだろう...それはおそらく私がやったことを愚かなものです!

答えて

2

where句WHERE (sales.transDate BETWEEN @fromDate AND @toDate)は、売上なしで週を削除します。おそらくサブクエリを実行してトランザクションを引き出し、それをあなたの週テーブルに参加させる必要があります。

SELECT Weeks.WeekNum, SUM(sales.quantity) AS sales 
FROM Weeks LEFT OUTER JOIN 
(
    SELECT * 
    FROM sales 
    WHERE (sales.transDate BETWEEN @fromDate AND @toDate) 
) sales 
    ON Weeks.WeekNum = DATEPART(week, sales.transDate) 
GROUP BY Weeks.WeekNum 
+0

おかげで、完全に働きました。私はその厄介なwhere節については考えていませんでした。 – CYMR0

1

WHERE (sales.transDate BETWEEN @fromDate AND @toDate)を取り除く書いmsmucker0527 @として、私は、サブ選択

SELECT Weeks.WeekNum, SUM(sales.quantity) AS sales 
FROM Weeks 
LEFT OUTER JOIN sales ON (Weeks.WeekNum = DATEPART(week, sales.transDate) AND sales.transDate BETWEEN @fromDate AND @toDate) 
GROUP BY Weeks.WeekNum 
+0

これはうまく動作していますが、より洗練されていますが、他のクエリはテストで速く実行されました。助けてくれてありがとう – CYMR0

1

対この方法を好みます。 また、この方法でそれを行うことができます。

SELECT Weeks.WeekNum, SUM(sales.quantity) AS sales 
FROM Weeks W 
    LEFT JOIN sales S ON W.WeekNum = DATEPART(week, S.transDate) 
      AND S.transDate BETWEEN @fromDate AND @toDate) 
GROUP BY W.WeekNum 

また、これは非常にあなたのクエリを遅くすることができIndex ScanSalesのテーブルを保証WHERE (sales.transDate BETWEEN @fromDate AND @toDate)
WeeksテーブルにWeekFirstDate datetimeWeekLastDate datetimeの列を追加し、CREATE NONCLUSTERED INDEX IX_Name ON Sales (TransDate) INCLUDE (quantity)に追加することをお勧めします。この場合、クエリは、この方法を変更することができます。

SELECT Weeks.WeekNum, SUM(sales.quantity) AS sales 
FROM Weeks W 
    LEFT JOIN sales S ON S.transDate>=W.WeekFirstDate 
          AND S.transDate<=W.WeekLastDate 
          AND S.transDate BETWEEN @fromDate AND @toDate) 
GROUP BY W.WeekNum 
+0

ありがとう!私はSQLに慣れていないので、インデックスなどについて多くのことを学ぶ必要があります。 – CYMR0

+0

@ CYMR0ようこそ。あなたの学習に幸運。 –

1

はこれを試してみてください:

SELECT Weeks.WeekNum, SUM(sales.quantity) AS sales 
FROM Weeks 
LEFT JOIN sales 
     ON Weeks.WeekNum = DATEPART(week, sales.transDate) and 
      sales.transDate BETWEEN @fromDate AND @toDate 
WHERE Weeks.WeekNum BETWEEN DATEPART(week, @fromDate) AND 
          DATEPART(week, @toDate) 
GROUP BY Weeks.WeekNum 
+0

申し訳ありませんが、動作しませんでした。 – CYMR0

+0

@ CYMR0:どのように動作しませんでしたか?クエリによって返されたものは何ですか? –

関連する問題