2011-11-08 16 views
1

SQLで2つのテーブルを結合しようとしています.1つはアイテムのリストを含み、もう1つは販売された日付です。私は結合部をダウンさせましたが、REPORTテーブルから情報を取得する必要がありますが、VENDORSテーブルのすべての項目を取得する必要があります。私は、NULL、または好ましくは0として表示するために販売されていないアイテムが必要です。これは私がこれまで使用しているコードであり、それは特定の日に販売されたアイテムを表示しているだけです。テーブルのSQLと完全に結合する場所

SELECT t2.[DATE] 
     ,t1.[VENDOR] 
     ,t1.[UPC] 
     ,t2.[QTY] 
     ,t2.[AMOUNT] 
FROM [STORESQL].[dbo].[VENDORS] t1 
LEFT OUTER JOIN [STORESQL].[dbo].[REPORT] t2 ON t1.UPC=t2.UPC 
WHERE VENDOR='119828' AND DATE='2011-11-8' 

及び例

VENDORSある:

VENDOR UPC 
119828 1 
119828 2 
119828 3 

REPORT:

DATE  UPC QTY AMOUNT 
2011-11-8 1  1  9.99 
2011-11-8 3  2  18.98 

現在のコードが

DATE  VENDOR UPC QTY AMOUNT 
2011-11-8 119828 1  1  9.99 
2011-11-8 119828 3  2  18.98 
もたらすれます

は、私はそれは私が何か間違ったことをやっている知っている

DATE  VENDOR UPC QTY AMOUNT 
2011-11-8 119828 1  1  9.99 
2011-11-8 119828 2  0  0.00 
2011-11-8 119828 3  2  18.98 

を表示する必要がありますが、私はそれが何であるかを知りません。 ありがとうございます。

答えて

4

代わりにこれを試してみてください:DATEに対する句があなたの外になります

SELECT t2.[DATE] 
     ,t1.[VENDOR] 
     ,t1.[UPC] 
     ,t2.[QTY] 
     ,t2.[AMOUNT] 
FROM [STORESQL].[dbo].[VENDORS] t1 
LEFT OUTER JOIN [STORESQL].[dbo].[REPORT] t2 ON t1.UPC=t2.UPC AND DATE='2011-11-8' 
WHERE VENDOR='119828' 

ザ・比較はDATEにNULL値に対してとなりますので、内部結合として機能するように参加します。比較をON句に移すと、それに対処する必要があります。

,COALESCE(t2.[QTY], 0) 
,COALESCE(t2.[AMOUNT], 0) 

あなたの日付列もnullになり、それが同様にCOALESCEで固定することができます:

COALESCE(t2.[DATE], '2011-11-8') 
+0

パーフェクト..ありがとうございました –

1

あなたはCOALESCEを使用することができ、結果として0の代わりに、ヌルを取得するには

これは互換性がありません:

  • WHERE t2.DATE='2011-11-8'
  • 売れていない商品がNULLとして表示される必要があります。

あなたの行に対する一致がT1にありませんでしたすべてのそれらのレコードを削除するため、最初のWHERE句は、OUTERのすべての効果がJOINをキャンセルさせていただきます。たぶん、あなたは欲しい:

WHERE VENDOR='119828' AND (DATE='2011-11-8' OR DATE IS NULL) 
0
WITH VENDORS 
    AS 
    (
     SELECT * 
     FROM (
       VALUES (119828, 1), 
        (119828, 2), 
        (119828, 3) 
      ) AS T (VENDOR, UPC) 
    ), 
    REPORT 
    AS 
    (
     SELECT * 
     FROM (
       VALUES ('2011-11-08T00:00:00', 1, 1, 9.99), 
        ('2011-11-08T00:00:00', 3, 2, 18.98) 
      ) AS T ("DATE", UPC, QTY, AMOUNT) 
    ), 
    AllReportDates 
    AS 
    (
     SELECT DISTINCT "DATE" 
     FROM REPORT 
    ) 
SELECT r."DATE", v.VENDOR, v.UPC, r.QTY, r.AMOUNT 
    FROM VENDORS v 
     JOIN REPORT r 
      ON v.UPC = r.UPC 
UNION 
SELECT a."DATE", v.VENDOR, v.UPC, 0 AS QTY, 0.00 AS AMOUNT 
    FROM VENDORS v 
     CROSS JOIN AllReportDates a 
WHERE NOT EXISTS (
        SELECT * 
        FROM REPORT r 
        WHERE r.UPC = v.UPC 
          AND r."DATE" = a."DATE" 
       ); 
関連する問題