【问题标题】:return a row where none exists when joining返回加入时不存在的行
【发布时间】:2013-11-02 02:32:24
【问题描述】:

我有一个交易表,其中包含交易日期、交易总额和信用卡 ID。我将此交易表加入到具有信用卡 ID 和信用卡类型的 cardtype 表中 - 此表仅包含 4 行信用卡类型为 Visa、Master Card、Discover 和 American Express。

我想查看每个日期和地点的所有交易日期、总计和信用卡类型,但我希望返回所有日期和信用卡类型的一行,即使没有使用特定信用卡类型进行交易(即,即使没有使用 Visa 信用卡进行交易,我也希望在 9 月 1 日返回 4 行。

正确的联接不起作用,因为所有 4 种信用卡类型都在不同的日期使用。有什么想法吗?

【问题讨论】:

  • 使用LEFT OUTER JOIN

标签: sql transactions


【解决方案1】:

您需要使用返回所有交易日期和信用卡类型的叉积的子查询,然后将其与交易进行 LEFT JOIN:

SELECT c.txn_date txn_date, card_type, SUM(txn_total) daily_total
FROM (SELECT card_id, card_type, txn_date
      FROM cardtype
      JOIN (SELECT DISTINCT txn_date FROM transaction) t) c
LEFT JOIN transaction t
ON t.card_id = c.card_id AND t.txn_date = c.txn_date
GROUP BY c.card_id, txn_date
ORDER BY txn_date, card_type

SQLFIDDLE

【讨论】:

  • 是不是 SELECT card_id, card_type, txn_date FROM cardtype JOIN (SELECT DISTINCT txn_date FROM transaction) t 缺少它加入的内容?我需要将 cardtypeid 添加到 select distinct txn_date from transaction....
  • 它没有加入任何东西,它正在创建一个完整的交叉产品。
  • 好的,但是我在尝试运行它时遇到错误,因为 ) 之后的语法不正确......
  • 我刚刚修复了一个模棱两可的列,但我没有收到语法错误。看看我的小提琴。
猜你喜欢
  • 1970-01-01
  • 2019-06-14
  • 2021-11-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多