7

私は収益の表を持っています

title_id     revenue    cost
   1            10        5
   2            10        5
   3            10        5
   4            10        5
   1            20        6                    
   2            20        6
   3            20        6
   4            20        6

このクエリを実行すると

SELECT SUM(revenue),SUM(cost)
FROM revenue
GROUP BY revenue.title_id

それは結果を生み出す

title_id     revenue    cost
   1            30        11
   2            30        11
   3            30        11
   4            30        11

これで問題ありません。合計結果を、このような構造を持つ別のテーブルと組み合わせたいと思います

title_id     interest    
   1            10        
   2            10        
   3            10        
   4            10        
   1            20                            
   2            20        
   3            20        
   4            20        

このように集計関数で結合を実行すると

SELECT SUM(revenue),SUM(cost),SUM(interest)
FROM revenue
LEFT JOIN fund ON revenue.title_id = fund.title_id
GROUP BY revenue.title_id,fund.title_id      

それは結果を2倍にします

title_id     revenue    cost    interest
   1            60        22       60
   2            60        22       60
   3            60        22       60
   4            60        22       60

どうして2倍なのか理解できません 助けてください

4

3 に答える 3

15

資金と収益の表でタイトルが繰り返されているため、倍増しています。これにより、一致するレコードの数が増加します。これは、集計関数を削除して生データを見ると非常に簡単に確認できます。こちらをご覧ください

これを回避する方法は、集計のインライン ビューを作成し、それらの結果を結合することです。

SELECT R.title_id, 
       R.revenue, 
       R.cost, 
       F.interest 
FROM   (SELECT title_id, 
               Sum(revenue) revenue, 
               Sum(cost)    cost 
        FROM   revenue 
        GROUP  BY revenue.title_id) r 
       LEFT JOIN (SELECT title_id, 
                         Sum(interest) interest 
                  FROM   fund 
                  GROUP  BY title_id) f 
              ON r.title_id = F.title_id 

出力

| TITLE_ID | REVENUE | COST | INTEREST |
----------------------------------------
|        1 |      30 |   11 |       30 |
|        2 |      30 |   11 |       30 |
|        3 |      30 |   11 |       30 |
|        4 |      30 |   11 |       30 |

デモ

于 2012-07-06T14:34:31.323 に答える
3

これは、テーブルをグループ化せずに、2 番目のテーブルから最初の派生テーブルを結合したためです。この問題を解決するには、2 番目のテーブル ( fund) をグループ化し、LEFT JOIN を使用して最初の派生テーブルと結合します。

SELECT  b.title_id,
        b.TotalRevenue,
        b.TotalCost,
        d.TotalInterest
FROM 
(
    SELECT   a.title_id, 
             SUM(a.revenue) TotalRevenue, 
             SUM(a.cost) TotalCost
    FROM     revenue a
    GROUP BY a.title_id
) b LEFT JOIN
(
    SELECT   c.title_id, 
             SUM(a.interest) TotalInterest
    FROM     fund c
    GROUP BY c.title_id
) d ON b.title_id = d.title_id
于 2012-07-06T14:59:54.480 に答える
1

収益テーブルには、title_id ごとに 2 つの行があります。

于 2012-07-06T14:34:01.393 に答える