4

次のSQLステートメントがあります。

    select  
    a.desc
   ,sum(bdd.amount)
   from t_main c 
   left outer join t_direct bds on (bds.repid=c.id) 
   left outer join tm_defination def a on (a.id =bds.sId)
   where c.repId=1000000134
   group by a.desc;

実行すると、次の結果が得られます。

   desc       amount
   NW         12.00
   SW         10

別の左外部結合を追加して別の値のセットを取得しようとすると:

   select  
    a.desc
   ,sum(bdd.amount)
   ,sum(i.amt)
   from t_main c 
   left outer join t_direct bds on (bds.repid=c.id) 
   left outer join tm_defination def a on (a.id =bdd.sId)
   left outer join t_ind i on (i.id=c.id)
   where c.repId=1000000134
   group by a.desc;

基本的に、金額フィールドを次のように 2 倍にします。

         desc    amount   amt
         NW       24.00   234.00
         SE       20.00   234.00

結果は次のようになります。

        desc   amount   amt
        NW      12.00   234.00
        SE      10.00   NULL 

これを修正するにはどうすればよいですか?

4

3 に答える 3

7

あなたが言及したように本当にデータを受け取る必要がある場合は、サブクエリを使用して必要な計算を実行できます。この場合、コードは次のようになります。

select x.[desc], x.amount, y.amt
from
(
    select
         c.[desc]
       , sum (bdd.amount) as amount
       , c.id
    from t_main c 
    left outer join t_direct bds on (bds.repid=c.id) 
    left outer join tm_defination_def bdd on (bdd.id = bds.sId)
    where c.repId=1000000134
    group by c.id, c.[desc]
) x
left join
(
    select t.id, sum (t.amt) as amt 
    from t_ind t
    inner join t_main c
      on t.id = c.id
    where c.repID = 1000000134
    group by t.id
) y 
 on x.id = y.id

最初のサブ選択では、必要に応じてグループ化された最初の 2 つの列 と の集計データを受け取りdescますamount。2 番目の選択は、最初のセットのamtそれぞれに必要な値を返します。idこれらの結果を左結合すると、必要な結果が得られます。t_main2 番目の選択へのテーブルの追加は、パフォーマンスの問題のために行われました。

別の解決策は次のとおりです。

select
     c.[desc]
   , sum (bdd.amount) as amount
   , amt = (select sum (amt) from t_ind where id = c.id)
from #t_main c 
left outer join t_direct bds on (bds.repid=c.id) 
left outer join tm_defination_def bdd on (bdd.id = bds.sId)
where c.repId = 1000000134
group by c.id, c.[desc]

結果は同じになります。基本的に、ネストされた選択を使用する代わりにamt、結果結合の各行ごとに合計の計算がインラインで実行されます。大きなテーブルの場合、2 番目のソリューションのパフォーマンスは最初のソリューションよりも悪くなります。

于 2013-10-28T08:54:33.873 に答える
6

あなたの新しい左外部結合は、複数の関係が原因である可能性が最も高いため、結果セットでいくつかの行を数回返すことを強制しています。SUM を削除し、返された行を確認して、必要な行を正確に特定し (該当する場合は、特定のタイプの t_ind レコードに制限する可能性があります??)、それに応じてクエリを調整します。

于 2013-10-28T05:37:01.523 に答える