2016-05-07 4 views
0

3つの異なるクエリの結果を合計する必要があります。ここに私がやっていることはありますが、結果は間違っています。私は別々にそれぞれのクエリを実行する場合、彼らは正常ですが、それらを一緒に実行すると、私は別の結果を得る。サブクエリで異なるクエリの結果を合計

select 'Inforce TIV', 
ISNULL(SUM(a.TSI), 0) 
+ 
ISNULL(SUM(b.TSI), 0) 
+ 
ISNULL(SUM(c.TSI), 0) 
from 
(
    select ISNULL(SUM(p.[Suma Asegurada Inforce]), 0) as TSI 
    from temp_portafolio_cy p 
    --where p.fec_emi between @varFechaDesde and @varFechaHasta 
    where p.fec_emi between '20160101' and '20160131' 
    and p.sn_bancaseguros = 0 
    group by p.cod_suc, p.cod_ramo_comercial, p.Poliza, p.Item 
) a, 
(
    select ISNULL(p.[Suma Asegurada Inforce], 0) as TSI 
    from temp_portafolio_cy p 
    --where p.fec_emi between @varFechaDesde and @varFechaHasta 
    where p.fec_emi between '20160101' and '20160131' 
    and p.sn_bancaseguros = -1 
    and not (
     (p.cod_suc = 1 and p.cod_ramo_comercial = 34 and p.Poliza = 51385) 
     or (p.cod_suc = 1 and p.cod_ramo_comercial = 26 and p.Poliza = 53231) 
    ) 
    group by p.cod_suc, p.cod_ramo_comercial, p.Poliza, p.Item, p.[Suma Asegurada Inforce] 
) b, 
(
    select ISNULL(p.[Suma Asegurada], 0) as TSI 
    from temp_portafolio_cy p 
    --where p.fec_emi between @varFechaDesde and @varFechaHasta 
    where p.fec_emi between '20160101' and '20160131' 
    and p.sn_bancaseguros = -1 
    and (
     (p.cod_suc = 1 and p.cod_ramo_comercial = 34 and p.Poliza = 51385) 
     or (p.cod_suc = 1 and p.cod_ramo_comercial = 26 and p.Poliza = 53231) 
    ) 
    group by p.cod_suc, p.cod_ramo_comercial, p.Poliza, p.Item, p.[Suma Asegurada] 
) c 
+1

単純なルール:* * 'JOINの中にカンマを使用しないでください'句。 *常に*明示的な 'JOIN'構文を使用します。 –

+0

私は内部結合を行う方法がわかりません(同じテーブルを考えると)。クエリに基づいて例を書くことができますか? –

答えて

0

3組の結果をデカルト結合しています。あなたは2つのオプションがあり :

  1. を文
  2. 「によってグループ」すべて削除し3のそれぞれにおけるによって列あなたのグループ化が文を選択含め、どこで例えば(それらを一緒に参加するときにwhere句を追加しますa.code_suc = b.code_sucとb.code_suc = c.code_suc ...など)

あなたが指定した例では、 "group by"は本当に必要ではないので、オプション1をお勧めしますwhere句を使って暗黙的な内部結合を行うことができます

+0

私はグループを除外していましたが、group byを削除すると、重複した値がcond.subsideringされているために必要です。したがって、2番目のオプションは最良の解決策です。単に、各統計結果がロードされ、合計値が加算される一時テーブルを追加します。よろしく –

0

group byは、おそらくあなたはすなわち、乗算を通じて間違った合計を引き起こし、その結果に参加デカルト取得する原因となっています。多分このように書くことができますか?

select 'Inforce TIV', 
ISNULL(SUM(a.TSI), 0) 
+ 
ISNULL(SUM(b.TSI), 0) 
+ 
ISNULL(SUM(c.TSI), 0) 
from 
(
    select ISNULL(SUM(p.[Suma Asegurada Inforce]), 0) as TSI 
    from temp_portafolio_cy p 
    --where p.fec_emi between @varFechaDesde and @varFechaHasta 
    where p.fec_emi between '20160101' and '20160131' 
    and p.sn_bancaseguros = 0 
) a, 
(
    select ISNULL(p.[Suma Asegurada Inforce], 0) as TSI 
    from temp_portafolio_cy p 
    --where p.fec_emi between @varFechaDesde and @varFechaHasta 
    where p.fec_emi between '20160101' and '20160131' 
    and p.sn_bancaseguros = -1 
    and not (
     (p.cod_suc = 1 and p.cod_ramo_comercial = 34 and p.Poliza = 51385) 
     or (p.cod_suc = 1 and p.cod_ramo_comercial = 26 and p.Poliza = 53231) 
    ) 
) b, 
(
    select ISNULL(p.[Suma Asegurada], 0) as TSI 
    from temp_portafolio_cy p 
    --where p.fec_emi between @varFechaDesde and @varFechaHasta 
    where p.fec_emi between '20160101' and '20160131' 
    and p.sn_bancaseguros = -1 
    and (
     (p.cod_suc = 1 and p.cod_ramo_comercial = 34 and p.Poliza = 51385) 
     or (p.cod_suc = 1 and p.cod_ramo_comercial = 26 and p.Poliza = 53231) 
    ) 
) c 
0

サブクエリのいずれかが複数の行を返す場合、興味深い結果を生成する3つの別々のサブクエリ(a、b、c)のクロス結合を作成しています。

クエリを修正するにはいくつかの方法があります。サブクエリでGROUP BYを使用する必要がなくなり、全体的にクエリが簡素化される以下の方法をお勧めします。 (。サブクエリがnull TSI値を返すことはありません場合はところで、あなたはISNULL(SUM(TSI)に結果列を簡略化することができ、0))

select 'Inforce TIV', 
ISNULL(SUM(ISNULL(TSI, 0)), 0) 
FROM (
    select p.[Suma Asegurada Inforce] as TSI 
    from temp_portafolio_cy p 
    --where p.fec_emi between @varFechaDesde and @varFechaHasta 
    where p.fec_emi between '20160101' and '20160131' 
    and p.sn_bancaseguros = 0 

    UNION ALL 

    select p.[Suma Asegurada Inforce] 
    from temp_portafolio_cy p 
    --where p.fec_emi between @varFechaDesde and @varFechaHasta 
    where p.fec_emi between '20160101' and '20160131' 
    and p.sn_bancaseguros = -1 
    and not (
     (p.cod_suc = 1 and p.cod_ramo_comercial = 34 and p.Poliza = 51385) 
     or (p.cod_suc = 1 and p.cod_ramo_comercial = 26 and p.Poliza = 53231) 
    ) 

    UNION ALL 

    select p.[Suma Asegurada] 
    from temp_portafolio_cy p 
    --where p.fec_emi between @varFechaDesde and @varFechaHasta 
    where p.fec_emi between '20160101' and '20160131' 
    and p.sn_bancaseguros = -1 
    and (
     (p.cod_suc = 1 and p.cod_ramo_comercial = 34 and p.Poliza = 51385) 
     or (p.cod_suc = 1 and p.cod_ramo_comercial = 26 and p.Poliza = 53231) 
    ) 
) x 
関連する問題