2009-07-08 23 views
3

私は2つのテーブルを持っています.1つはすべてのブランチで、もう1つはすべて私のセールスです。 salesテーブルには、営業担当者ID、支店ID、月と年が含まれています。T-SQL、結合で一致しないためのゼロ和

ブランチと月でグループ化された特定の担当者の売上の合計を返すクエリが必要です。その月のブランチに売上がない場合、クエリは0を返す必要があります。私は販売が存在しない場合は0を返さない、次います

SELECT 
    s.Month, 
    b.BranchName, 
    SUM(s.InvoiceAmount) AS 'Sales' 
FROM 
    Branch b 
INNER JOIN 
    Sales s ON s.BranchID = b.BranchID 
WHERE 
    s.Year = 2008 
AND 
    s.SalesRepID= 11 
GROUP BY 
    s.Month, 
    b.BranchName 
ORDER BY 
    s.Month, 
    b.BranchName 
+0

SELECTリストにs.Monthがありません。 – pjp

+0

私の間違い、はいs.MonthはSELECTにあります – staterium

+0

(OPで修正されました) – staterium

答えて

4

"欠落している"データを追加する必要があります。

SELECT 
    b.BranchName, 
    SUM(ISNULL(s.InvoiceAmount, 0)) AS 'Sales', 
    s.Month 
FROM 
    Branch b 
    LEFT OUTER JOIN (
      SELECT 
     b.BranchID AS BranchID 
     , s.SalesRepID AS SalesRepID 
     , Months.Month AS Month 
     , Years.Year AS Year 
     , 0 AS InvoiceAmount 
     FROM 
      Sales s 
      CROSS JOIN (
      SELECT 1 AS Month 
      UNION ALL SELECT 2 
      UNION ALL SELECT 3 
      UNION ALL SELECT 4 
      UNION ALL SELECT 5 
      UNION ALL SELECT 6 
      UNION ALL SELECT 7 
      UNION ALL SELECT 8 
      UNION ALL SELECT 9 
      UNION ALL SELECT 10 
      UNION ALL SELECT 11 
      UNION ALL SELECT 12 
      ) Months 
      CROSS JOIN (
      SELECT 2007 AS Year 
      UNION ALL SELECT 2008 
      UNION ALL SELECT 2009 
      ) Years 
      CROSS JOIN Branch b 
     UNION ALL SELECT 
     s.BranchID AS BranchID 
     , s.SalesRepID AS SalesRepID 
     , s.Month AS Month 
     , s.Year AS Year 
     , s.InvoiceAmount AS InvoiceAmount 
     FROM Sales s  
    )s ON s.BranchID = b.BranchID  
WHERE 
    s.Year = 2008 
    AND s.SalesRepID= 11 
GROUP BY 
    s.Month, 
    b.BranchName 
ORDER BY 
    b.BranchName, 
    s.Month 
+0

私は何かのようなものを投稿しようとしていた – pjp

+1

私は質問を解釈する方法で一人ではないことを聞いて嬉しいです。他のすべての答えは、InvoiceAmountのNULL値に焦点を当てているようです。私はそれがOPが意味するものであるとは思わない。 –

+0

ありがとうLieven、それは動作しています。担当者がそのブランチで売上を持たなかった月の値は0になりましたが、クエリ全体では、営業担当者が今年のある時点で売上を得たブランチのみを返します。 – staterium

2

内の任意のレコードを持っていなくても担当者を戻すようにあなたは、LEFTは販売にJOINを行う必要があります営業テーブル。

+0

左の結合は、最終的なクエリに売上がないブランチを追加する必要があります。 – Spence

+0

-1 s.SalesRepIdにはwhere句があり、Sales上の左外部結合は無意味です。 – pjp

1

クエリはNULLを返す場合は、合体のいずれかの方法を使用することができますが:COALESCE(SUM(...), 0)は、リスト内の最初の非NULL値を返します...

+0

合体が合計の中にあるべきではありません。または、合計はNULL値を合計することができます。私はこれがSQLの断続的な警告を発することを信じています。 – pjp

+0

警告:Null値は、集計または他のSET操作によって削除されます。 (1行の影響を受けます) – pjp

0

私は、内側から外側の左及び追加に参加変更売上がないブランチのISNULL機能

あなたが参加し、左を使用する必要があると和権利を取得するには、ISNULL
SELECT 

    b.BranchName, 
    s.Month, 
    SUM(ISNULL(s.InvoiceAmount,0)) AS 'Sales' 
FROM 
    Branch b 
LEFT JOIN 
    Sales s ON s.BranchID = b.BranchID 
WHERE 
    s.Year = 2008 
AND 
    s.SalesRepID= 11 
GROUP BY 
    s.Month, 
    b.BranchName 
ORDER BY 
    s.Month, 
    b.BranchName 
+0

特定の月に売上がなくても、月ごとの販売を求める質問があります。このクエリは1年全体の結果を返します。 – pjp

+0

これは私の結果を変えなかった。 – staterium

0

:セールスマンが持っている場合は、まだあまりにも示すヶ月を取得することで、いくつかのより多くの作業を行う必要があり

SELECT b.BranchName 
, SUM(isnull(s.InvoiceAmount, 0)) AS 'Sales' 
FROM  Branch b 
LEFT JOIN Sales s ON s.BranchID = b.BranchID 
GROUP BY  s.Month, b.BranchName 
ORDER BY  s.Month, b.BranchName 

を特定の月に売り上げはありません。

関連する問題