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

取引金額は、同じマーチャントの金額の合計です No. トランザクション数は、マーチャントがトランザクションを使用した回数です マーチャント 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

もちろん、クエリを aRIGHT 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

DEFGは左側のテーブル(「トランザクション」)に表示されないため、左側のテーブルからすべての行を取得して右側で一致するものを見つけるLEFTJOINの結果には表示されません。1つのオプションは次のとおりです。1。テーブルを切り替えて、マーチャントのLEFTJOINトランザクションを実行します。2. COALESCEを使用して、適切なテーブルに対して取得するNULL値を処理し(DEFGに一致するものがないため)、0に置き換えます。

于 2013-01-23T17:27:25.333 に答える
0

あなたはほとんどそれを持っていました、ただ交換MerchantsしてTransaction:

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

LEFT JOIN で特定のテーブルのすべての行が必要な場合は、最初にそのテーブルに名前を付ける必要があります。

したがって、FROM マーチャントの LEFT JOIN トランザクションは、あなたが望むものを提供します。

于 2013-01-23T17:20:16.070 に答える
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

クエリ内のテーブルの順序を変更します - 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 に答える