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

合計で複数の左結合

    問題は、データと合計のデカルト結果が原因である可能性があります。明確にするために、ここに簡単なクエリがあります...私はそれをすべて持っているわけではなく、列を完全に結合するわけでもありません。これは明確にするためだけのものです。

    また、おそらく遭遇しているものの概念を読みやすく理解しやすくするために、列とエイリアスを省略していることも知っています。

    Select
          t1.yr,
          sum( t2.Amt ) as AmtChange
       FROM 
          budget AS t1
             LEFT JOIN Budget_Changes AS t2
                on t1.yr = t2.Yr
    

    最後に、問題ありません...特定の年について、2番目のテーブルから合計を取得します。表2には多くのレコードがあります。例:データ

    Budget
    Yr
    2013
    2014
    
    Budget_Changes
    Yr    Amt
    2013  10
    2013  20
    2013  30
    2014  40
    2014  50
    
    Your results would be
    Yr    AmtChange
    2013  60
    2014  90
    

    この時点でおそらく同意するでしょう...さて、年ごとに(または何でも)、年ごとに複数のレコードがある別のテーブルを投入します...

    Change_Orders
    Yr     COAmt
    2013   100
    2013   120
    2014   200
    2014   220
    

    そして、これをセカンダリの左結合としてクエリに追加します。たとえば、

    Select
          t1.yr,
          sum( t2.Amt ) as AmtChange,
          sum( t3.COAmt ) as COAmtChange
       FROM 
          budget AS t1
             LEFT JOIN Budget_Changes AS t2
                on t1.yr = t2.Yr
             LEFT JOIN Change_Orders AS t3
                on t1.yr = t3.Yr
    
    
    Your might expect the results to be
    Yr    AmtChange  COChangeAmt
    2013  60         220
    2014  90         420
    

    ただし、これはデカルトの結果であるため、各結合ごとに複数の行が、他のテーブルに存在する各エントリの結果をTIMES取得しています...のようなものです

    Yr    AmtChange  COChangeAmt
    2013  120         440
    2014  180         840
    

    これを修正するには、小計を取得する個々のテーブルを個別に処理し、独自の年でグループ化して、サブセットがデータのコンテキストごとに1行のみを返すようにする必要があります。のようなもの

    Select
          t1.yr,
          t2.AmtChange,
          t3.COAmtChange
       FROM 
          budget AS t1
             LEFT JOIN ( select BC.Yr, sum( BC.Amt ) as AmtChange
                            from Budget_Changes BC
                            group by BC.Yr ) t2
                on t1.yr = t2.Yr
             LEFT JOIN ( select CO.Yr, sum( CO.COAmt ) as COAmtChange
                            from Change_Orders CO
                            group by CO.Yr ) AS t3
                on t1.yr = t3.Yr
    

    したがって、サブクエリはそれぞれ、集計されたそれぞれの年の1つのレコードのみを返すため、sum()の金額の重複を防ぐことができます。



    1. SQLで絶対値を計算する方法

    2. AUTO_INCREMENTおよびLAST_INSERT_ID

    3. MariaDBクラスターにmaxctrlを使用したMaxScale管理の概要

    4. IPv4とは別のIPv6の正規表現(RegEx)