0

我是加入表的新手。我有一张像下面这样的“商人”表

Merchant_Number    Merchant_Name
   1                 ABCD
   2                 DEFG

我有一个如下表“交易”

Merchant_Number    Merchant_Name    Transaction_Amount
   1                 ABCD              100
   3                 XYZ               50
   1                 ABCD              50
   4                 nnn               200

我想加入上面 2 个表,结果如下

Merchant_Number    Merchant_Name    Transaction Amount   No. Of Transactions
   1                 ABCD              150                    2
   2                 DEFG              0                      0
   3                 XYZ               50                     1 
   4                 nnn               200                    1

交易金额为同一商户金额之和 交易次数为该商户使用其交易的次数 商户 ABCD 有 2 笔交易,其总交易金额为 150

我有一个查询

SELECT Merchant_Name, sum(transaction_amount)  as 'Transaction Amount',
count(*) as 'No. Of Transactions'
FROM Transactions
LEFT JOIN Merchants using (MERCHANT_NUMBER) 
group by Merchant_Name

但这只给了我交易表中的商家,即,

Merchant_Number    Merchant_Name    Transaction Amount   No. Of Transactions
       1                 ABCD              150                    2
       3                 XYZ               50                     1 
       4                 nnn               200                    1

如何查询以便我得到如上所述的结果?

任何帮助将不胜感激!

4

6 回答 6

2

您希望以相反的方式加入,这样您就包括所有商家,无论他们是否有交易(这是 LEFT JOIN 所做的):

SELECT Merchant_Name, sum(transaction_amount)  as `Transaction Amount`,
    count(*) as `No. Of Transactions`
FROM Merchants
LEFT JOIN Transactions using (MERCHANT_NUMBER) 
group by Merchant_Name

当然,您可以改为将查询更改为写入 a RIGHT JOIN(而不是 a LEFT JOIN),但我发现这只会使代码难以阅读,因此我倾向于避免使用它们。

请注意您所写的查询与您所经历的一样;它显示所有交易,无论他们是否有商家(FROM Transactions LEFT JOIN Merchants


正如我刚刚注意到的,您的数据没有标准化。您的交易表中有额外的商家,这些商家未计入您的商家表中。这会给你带来很多麻烦。

您应该找出是什么原因并阻止它,最好的方法是Merchant_Name从您的 Transactions 表中完全删除该列。如果您无法控制表格设计,则应该与可以控制的人交谈:-P。除此之外,请尝试:

SELECT Merchant_Name, sum(transaction_amount)  as `Transaction Amount`,
    count(*) as `No. Of Transactions`
FROM
(
    SELECT Merchant_Name, Merchant_Number
    FROM Merchants
    UNION
    SELECT Merchant_Name, Merchant_Number
    FROM Transactions
) Real_Merchants
LEFT JOIN Transactions using (MERCHANT_NUMBER) 
group by Merchant_Name
于 2013-01-23T17:19:34.943 回答
0

你几乎拥有它,只需交换MerchantsTransaction

SELECT Merchant_Name, SUM(transaction_amount)  AS 'Transaction Amount',
COUNT(*) AS 'No. Of Transactions'
FROM Merchants
LEFT JOIN Transactions using (MERCHANT_NUMBER) 
GROUP BY Merchant_Name
于 2013-01-23T17:19:13.647 回答
0

您必须规范化您的数据库。尝试这个:

SELECT
  MN.Merchant_Number,
  MN.Merchant_Name,
  ISNULL(SUM(T.Amount), 0) TransactionAmount,
  COUNT(T.Merchant_Number) NoOfTransactions
FROM
(
   SELECT Merchant_Number, Merchant_Name FROM Merchants
   UNION
   SELECT Merchant_Number, Merchant_Name FROM Transactions
) MN
  LEFT JOIN Transactions T
    ON MN.Merchant_Number  = T.Merchant_Number
GROUP BY MN.Merchant_Number, MN.Merchant_Name
于 2013-01-23T17:25:19.230 回答
0

当您想要在 LEFT JOIN 中来自特定表的所有行时,您需要先命名该表。

所以 FROM 商家 LEFT JOIN 交易会给你你想要的。

于 2013-01-23T17:20:16.070 回答
0

更改查询中表的顺序 - Merchants LEFT JOIN Transactions。然后,您需要用零替换一些 NULL 值。像这样的东西:

SELECT Merchant_Name, ISNULL(SUM(transaction_amount), 0)  AS 'Transaction Amount',
COUNT(*) AS 'No. Of Transactions'
FROM Merchants
LEFT JOIN Transactions using (MERCHANT_NUMBER) 
GROUP BY Merchant_Name
于 2013-01-23T17:20:33.927 回答
0

由于 DEFG 没有出现在左表(“事务”)中,它不会出现在 LEFT JOIN 的结果中,它从左表中获取所有行并在右表中找到它们的匹配项。一种选择是: 1. 在表之间切换并执行 Merchants LEFT JOIN Transactions。2. 使用 COALESCE 处理您将要为正确的表获取的 NULL 值(因为那里没有与 DEFG 匹配的值),并将其替换为 0。

于 2013-01-23T17:27:25.333 回答