【问题标题】:Outputting default value when record not found找不到记录时输出默认值
【发布时间】:2017-01-19 02:37:20
【问题描述】:

我在各自的表格中选择了 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 没有关联。以下查询查询不存在的日期

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

我会得到的当前输出是(没有找到记录):

ProductID  | Product Desc | TransactionDate | TransactionPrice
           |              |                 | 

我要查找的输出仍将输出查询中指定的 productID productDesc 和 transactionDate,但将 transactionPrice 返回为 0。

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

如果在给定的 TransactionDate (2017-01-08) 上没有发生给定 ProductID (1011021) 的交易,我想强制将 transactionPrice 设置为 0,还有其他关于如何实现这一点的建议吗?

【问题讨论】:

  • 如果没有交易,为什么会有交易日期?如果您尝试在某个范围内的每个日期强制执行 0 金额的交易,那么您需要在问题中说明这一点。
  • 是的,这就是我想要做的,我现在已经在问题中说明了这一点,您有什么建议吗?
  • 是的。使用函数填充您的范围内的日期临时表并完全加入它。这方面有很多例子。查找日历表。不过,有人可能会给你一个解决方案。干杯!
  • 介意分享这些例子吗?
  • 我在手机上,所以很难为你编码

标签: sql sql-server database azure-sql-database


【解决方案1】:
  1. 使用LEFT JOIN 代替INNER
  2. WHERE 子句中允许NULL 用于transactions.transactionDatetransactionProducts.productID,这样当它们在其他表中没有对应的记录时,它们应该向上。
  3. 由于您想要所有产品,即使没有交易,那应该是FROM 子句,后跟LEFT JOIN's。
  4. 此外,如果您希望 transactionProducts.price 显示为 0 而不是 NULL,请将 SELECT 中的更改为 ISNULL(transactionProducts.price, 0)

这样,(a) 即使没有交易,所有产品都会显示在其中,并且 (b) transactionDate 上的 WHERE 子句不会排除丢失的记录:

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() 应用于也是。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-26
    • 1970-01-01
    • 2018-02-10
    • 2015-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多