2017-01-19 5 views
0

それぞれのテーブルで4つの異なる列を選択しています。 ProductID、ProductDesc、TransactionDate、およびTransactionPrice。レコードが見つからないときにデフォルト値を出力する

レコードが存在する例として、以下のクエリを使用して:

SELECT transactionProducts.productID, products.productDesc, transactionDate, transactionProducts.price 
FROM transactionProducts INNER JOIN transactions ON transactionProducts.transactionID = transactions.transactionID 
INNER JOIN products on products.productID=transactionProducts.productID 
WHERE (transactionProducts.productID='1011021' AND transactions.transactionDate='2017-01-07') 
GROUP BY transactionProducts.productID, products.productDesc, transactionDate, transactionProducts.price 
ORDER BY transactionDate 

ProductID | Product Desc | TransactionDate | TransactionPrice 
1011021 | SD DOG  | 2017-01-07  | $15 

私の目標は、さえのproductID(例えば1011021)場合は、レコードを返すことですが、次のように出力されていますtransactionDateに関連付けられていません。

ProductID | Product Desc | TransactionDate | TransactionPrice 
      |    |     | 

私は考えまだ出力のproductID productDescを探しています出力:私はなるだろう現在の出力は(レコードが見つからない)だろう

SELECT transactionProducts.productID, products.productDesc, transactionDate, transactionProducts.price 
FROM transactionProducts INNER JOIN transactions ON transactionProducts.transactionID = transactions.transactionID 
INNER JOIN products on products.productID=transactionProducts.productID 
WHERE (transactionProducts.productID='1011021' AND transactions.transactionDate='2017-01-18') 
GROUP BY transactionProducts.productID, products.productDesc, transactionDate, 
ORDER BY transactionDate 

存在doesntの日付については、以下のクエリのクエリそして、クエリで指定されたが、私はグラムのトランザクション場合は0に設定するtransactionPriceを強制したい0

ProductID | Product Desc | TransactionDate | TransactionPrice 
1011021 | SD DOG  | 2017-01-18  | 0 

としてtransactionPriceを返したtransactionDateこと指定されたTransactionDate(2017-01-08)でProductID(1011021)が発生しなかった場合、これを達成する方法として他に何か提案がありますか?

+1

取引がない場合なぜ取引日があるのですか?ある範囲内のすべての日付に対して0の金額の取引を強制しようとしている場合は、それをその質問に記載する必要があります。 – scsimon

+0

はい、それは私がやろうとしていることです、私は今質問でそれを述べています、あなたは何か提案がありますか? – MJJLAM

+0

関数を使用して、範囲内の日付のテンポラリテーブルを作成し、それにフル参加します。これには多くの例があります。カレンダーテーブルを参照してください。誰かがおそらくあなたに解決策を与えるだろう。乾杯! – scsimon

答えて

0
  1. LEFT JOIN代わりのINNER
  2. 彼らは、彼らが他のテーブルには対応するレコードを持つべきではないアップ時になるようWHERE句でtransactions.transactionDatetransactionProducts.productIDためNULL年代の許可を使用してください。
  3. トランザクションがない場合でもすべての商品が必要なので、LEFT JOINの後にFROMという句が必要です。
  4. NULLの代わりにtransactionProducts.price0と表示する場合は、SELECTの値をISNULL(transactionProducts.price, 0)に変更します。

その方法は、(a)は、すべての製品は、そこには、トランザクションがいないと、(b)transactionDateWHERE句が欠落しているレコードを除外していない場合でもに表示:

SELECT transactionProducts.productID, products.productDesc, transactionDate, ISNULL(transactionProducts.price, 0) 
FROM products 
LEFT JOIN transactionProducts on products.productID = transactionProducts.productID 
LEFT JOIN transactions ON transactionProducts.transactionID = transactions.transactionID 
WHERE (transactionProducts.productID = '1011021' OR transactionProducts.productID IS NULL) 
     AND 
     (transactions.transactionDate = '2017-01-18' OR transactions.transactionDate IS NULL) 
GROUP BY transactionProducts.productID, products.productDesc, transactionDate 
ORDER BY transactionDate 

注:transactionDateをその日にその商品の取引がない場合はNULLと表示されますので、他のデフォルトの日付を表示する場合はISNULL()を入力してください)

関連する問題