sql >> データベース >  >> RDS >> Mysql

SUM、LEFT JOIN、およびGROUPBYを含む複製

    したがって、何が起こっているかを確認するための最初のステップは、SUMを削除し、取引金額と請求金額を選択することです。そうすれば、どのデータが返されているかを確認できます。 A / 2007での結合は、各行をクレームテーブルに結合するため、トランザクション金額が2回になることがわかります。

    1つの解決策は、あなたが言ったように、サブクエリを使用して、参加する前にSUMを個別に実行することです。

    SELECT 
       Transactions.Customer,
       Transactions.Year,
       SumTransaction,
       SumClaim
    FROM (
          select Customer, Year, sum(Transaction Amount) SumTransaction 
          from Transactions
          group by Customer, Year
       ) Transactions
       LEFT JOIN (
          select Customer, Year, sum(Claim Amount) sumClaim 
          from Claims
          group by Customer, Year
       ) Claims
       ON Claims.Customer = Transactions.Customer
          AND Transactions.Year = Claims.Year
    

    制限がある場合の別の可能な解決策:

    SELECT 
       Transactions.Customer,
       Transactions.Year,
       SUM(Transaction Amount),
       (SELECT SUM(Claim Amount) from Claims where Claims.Customer = Transactions.Customer and Claims.Year = Transactions.Year)
    FROM 
       Transactions
    GROUP BY
       Customer, Year
    

    3番目の可能な解決策!!これはサブクエリを必要としません!この SQLFiddle を参照してください。

    select
        t.Customer,
        t.Year,
        sum(distinct t.Amount),
        sum(c.Amount)
    from
        Transactions t
        left join Claims c
            on  t.Customer = c.Customer
                and t.Year = c.year
    group by
        t.Customer,
        t.Year
    


    1. MySQLでデータベースを削除するSQLクエリ

    2. インデックスチューニングへのアプローチ–パート1

    3. Rails + OSX上のMySQL:ライブラリがロードされていません:libmysqlclient.18.dylib

    4. MySQL TRIM関数は改行やキャリッジリターンをトリミングしませんか?