0

我正在尝试对各种总计应用折扣。每个折扣都有自己的折扣代码,因此我想将代码应用于其等效总数。但有时此代码可能会出现不止一次。如果是这样,我想将折扣代码相加以产生一个折扣。

我的第一次尝试是不正确的,但准确地显示了我刚刚试图解释的内容,即。折扣码出现多次:

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

@Dukeling 使用 JOIN 的“完整”代码:

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

正如你所看到的,我得到了两个“DATOS INTERNET”,因为 descuento 有两个不同的值,它不会对它们求和。而且它仍然给出了一个巨大的折扣数字,它的总和太多了。

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看起来像什么,但您可能需要指定一个要JOIN打开的字段(否则它将基本上是一个CROSS JOIN- 一行与另一个表中的其他行匹配):

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

然后,当你JOIN在 f1 上时,你会得到 4 行,每个行的组合匹配一个。因此SUM(f2)= (8+9)*2(表 2 中的 2 行)。

SQLFiddle

可能有更有效的方法,但我现在能想到的唯一方法来解决它:

...
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 回答