0

さまざまな合計に割引を適用しようとしています。各割引には独自の割引コードがあるため、そのコードを同等の合計に適用したいと考えています。ただし、このコードが複数回表示される場合があります。もしそうなら、割引コードを合計して 1 つの割引を作成したいと思います。

私の最初の試みはこれでしたが、これは正しくありませんでしたが、説明しようとしたことを正確に示しています。複数回表示される割引コード:

SELECT bdto.dto_fac_cod_descuento,
    COUNT(bdto.dto_fac_cod_descuento) howmany,
    CASE
        WHEN COUNT(bdto.dto_fac_cod_descuento) > 1
            THEN ABS (ROUND (SUM(bdto.dto_fac_importe_dto), 0))
            ELSE ABS (ROUND (bdto.dto_fac_importe_dto, 0))
            END AS descuento
    FROM 
         bren_descuentos bdto
GROUP BY bdto.dto_fac_cod_descuento, bdto.dto_fac_importe_dto


dto_fac_cod_descuento   howmany descuento
714         1   4274.00
X23         1   4040.00
X23         1   3300.00
X23         1   2800.00
336         1   2584.00
E35         1   2519.00
713         1   1458.00
335         1   920.00
G07         1   610.00
M48         1   350.00
715         1   310.00
368         2   450.00
G07         1   94.00
168         1   70.00
349         1   62.00
X73         1   20.00
BN3         1   10.00
M47         1   2.00
A40         2   0.00
S11         1   0.00

多くの審議の後、私は現在、正しい答えを与える次のクエリを持っています(コードが最善であるとは思えませんが、今は関係ありません)

SELECT bdto.dto_fac_cod_descuento,
            CASE
        WHEN COUNT(bdto.dto_fac_cod_descuento) > 1
            THEN 
                ABS (ROUND (SUM(bdto.dto_fac_importe_dto), 0))
            ELSE 
                (SELECT ABS (dto_fac_importe_dto) FROM bren_descuentos bd
                    WHERE bdto.dto_fac_cod_descuento = bd.dto_fac_cod_descuento) 
        END AS descuento
    FROM 
         bren_descuentos bdto
GROUP BY bdto.dto_fac_cod_descuento 

dto_fac_cod_descuento   descuento
168         70.44
335         919.85
336         2584.31
349         62.16
368         450.00
713         1458.05
714         4273.73
715         309.62
A40         0.00
BN3         10.00
E35         2519.00
G07         704.00
M47         2.46
M48         349.77
S11         0.00
X23         10140.00
X73         20.00

私の問題は、このクエリは必要なものの一部にすぎないため、別のテーブルに参加する必要があることです.JOINを適用すると、結果がうまくいかず、修正方法がわかりません!

JOIN を適用すると、次のようになります。

SELECT bdto.dto_fac_cod_descuento,
            CASE
        WHEN COUNT(bdto.dto_fac_cod_descuento) > 1
            THEN 
                ABS (ROUND (SUM(bdto.dto_fac_importe_dto), 0))
            ELSE 
                (SELECT ABS (dto_fac_importe_dto) FROM bren_descuentos bd
                    WHERE bdto.dto_fac_cod_descuento = bd.dto_fac_cod_descuento) 
        END AS descuento
    FROM bren_detalle bdet
         JOIN
         bren_descuentos bdto
ON bdet.det_unidad_medida = 'megabytes'
GROUP BY bdto.dto_fac_cod_descuento

dto_fac_cod_descuento   descuento
168         318177.00
335         4154962.00
336         11673328.00
349         280777.00
368         2032650.00
713         6586012.00
714         19304438.00
715         1398554.00
A40         0.00
BN3         45170.00
E35         11378323.00
G07         3179968.00
M47         11112.00
M48         1579911.00
S11         0.00
X23         45802380.00
X73         90340.00

JOINを使用した@Dukelingの「フル」コード:

SELECT bdet.det_tipo_trafico tipo_trafico, 
        COUNT (bdet.det_tipo_trafico) total_numero, 
        ROUND (SUM (bdet.det_cantidad_medida_originada + bdet.det_cantidad_medida_recibida), 0) total_megas,
        ROUND (SUM (bdet.det_importe), 2) total_importe,
        ABS (ROUND (SUM(bdto.dto_fac_importe_dto), 0)) AS descuento,
        ROUND ((SUM (bdet.det_cantidad_medida_originada + bdet.det_cantidad_medida_recibida)) / NULLIF (COUNT (bdet.det_tipo_trafico), 0), 0) mb_conxn
    FROM bren_detalle bdet
        JOIN
         bren_descuentos bdto
ON bdet.det_unidad_medida = 'megabytes'
    AND bdet.dto_fac_cod_descuento = bdto.dto_fac_cod_descuento
GROUP BY bdet.det_tipo_trafico, bdto.dto_fac_importe_dto, bdto.dto_fac_cod_descuento

次の結果が得られます。

tipo_trafico            total_numero    total_megas total_importe   descuento   mb_conxn
DATOS EN ITINERANCIA        224     2176        653,88      0.00        10
MENSAJES MULTIMEDIA EN ITINERA  1       0       0,7     10.00       0
DATOS INTERNET          4389        38338       1789,19     412566.00   9
MENSAJES MULTIMEDIA     15      2       6,36        37785.00    0
DATOS INTERNET          4389        38338       1789,19     2677290.00  9

ご覧のとおり、descuento には 2 つの異なる値があるため、2 つの "DATOS INTERNET" が表示されます。また、割引にはまだ膨大な数があり、合計が多すぎます。

bren_detalle の内容の例 (さらに列がありますが、使用していません)

det_tipo_trafico            det_unidad_medida   det_importe dto_fac_cod_descuento   dto_fac_cod_descuento2
TRAFICO NAC.OTROS OPER.MOVILES      Minutos         3,6588          714         368
TRAFICO NAC.OTROS OPER.MOVILES      Minutos         1,4035          714         368
DATOS INTERNET  Megabytes   0,0583  G07 NULL
TRAFICO NAC.OTROS OPER.MOVILES  Minutos 8,756   714 368
TRAFICO NAC.OTROS OPER.MOVILES  Minutos 0,5195  714 368
DATOS INTERNET  Megabytes   0,0097  G07 NULL
INTERNO CORPORATIVO Minutos 0,1758  335 368
INTERNO CORPORATIVO Minutos 0,2617  335 368
TRAFICO NAC.OTROS OPER.MOVILES  Minutos 1,8313  714 368
INTERNO MOVILES Minutos 1,5993  336 368
TRAFICO NAC.OTROS OPER.MOVILES  Minutos 1,2165  714 368
INTERNACIONAL   Minutos 1,541   M48 NULL
TRAFICO NAC.OTROS OPER.MOVILES  Minutos 1,2108  714 368
DATOS INTERNET  Megabytes   0,3351  G07 NULL
DATOS INTERNET  Megabytes   0,9028  G07 NULL
DATOS INTERNET  Megabytes   0,0102  G07 NULL
RESTO DE TRAFICO NACIONAL   Minutos 2,4196  715 368
DATOS INTERNET  Megabytes   0,0271  G07 NULL
TRAFICO NAC.OTROS OPER.MOVILES  Minutos 2,8372  714 368
DATOS INTERNET  Megabytes   0,1574  G07 NULL

bren_descuentos テーブルの内容 (ここでもさらに列がありますが、使用されていません):

dto_fac_cod_descuento   dto_fac_importe_dto
S11 0.00
A40 0.00
BN3 -10.00
G07 -94.00
X23 -4040.00
168 -70.44
335 -919.85
336 -2584.31
349 -62.16
368 -225.00
368 -225.00
713 -1458.05
714 -4273.73
715 -309.62
A40 0.00
E35 -2519.00
M47 -2.46
M48 -349.77
X23 -3300.00
G07 -610.00
X23 -2800.00
X73 -20.00

例を挙げると、割引コード G07 は DATOS INTERNET トラフィックに対応しているため、合計で 610+94=704 の割引が適用されます。

4

1 に答える 1

1

それはどのbren_detalleように見えるかによって異なりますが、おそらくフィールドをJOINonに指定する必要があります(そうしないと、基本的にCROSS JOIN- 他のテーブルの他の行と一致する 1 つの行になります):

bren_detalle bdet
JOIN bren_descuentos bdto
  ON bdet.somefield = bdto.someotherfield
  AND bdet.det_unidad_medida = 'megabytes'

最初のクエリで望ましくない結果が得られた理由はdto_fac_importe_dtoGROUP BY . これにより、 と の個別の組み合わせごとに行が作成されdto_fac_cod_descuentoますdto_fac_importe_dto。それを削除するだけで動作するはずです:(またCASE、少し冗長に思えます)

SELECT bdto.dto_fac_cod_descuento,
    COUNT(bdto.dto_fac_cod_descuento) howmany,
    ABS (ROUND (SUM(bdto.dto_fac_importe_dto), 0)) AS descuento
FROM bren_descuentos bdto
GROUP BY bdto.dto_fac_cod_descuento

編集:

問題は、テーブルが次のようになっていることです。

table 1    table 2
f1 f2      f1 f3
1  8       1  10
1  9       1  11

次に、JOINf1 を実行すると、一致する行の組み合わせごとに 1 つずつ、4 つの行が取得されます。したがって、SUM(f2)= (8+9)*2 (表 2 の 2 行) です。

SQLフィドル

より効率的な方法があるかもしれませんが、それを修正するために私が今考えることができる唯一の方法は次のとおりです。

...
FROM (SELECT dto_fac_cod_descuento, SUM(someField), SUM(someOtherField)
      FROM bren_detalle
      WHERE det_unidad_medida = 'megabytes'
      GROUP BY dto_fac_cod_descuento) bdet
  JOIN
     (SELECT dto_fac_cod_descuento, SUM(someField), SUM(someOtherField)
      FROM bren_descuentos
      GROUP BY dto_fac_cod_descuento) bdto
    ON bdet.dto_fac_cod_descuento = bdto.dto_fac_cod_descuento
于 2013-02-28T19:15:20.387 に答える