2013-02-28 57 views
0

我试图对各种总计应用折扣。每个折扣都有自己的折扣代码,所以我想将代码应用到它的等价总额。但有时这些代码可能会出现多次。如果是这样,我想对折扣代码进行汇总以产生一个折扣。当我加入另一个表时,错误的SUM

我的第一次尝试是这是不正确的,但显示了我刚才试图解释,即。出现折扣码不止一次:

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互联网”,因为有两个不同的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的总折扣。

回答

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_descuentodto_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 

然后,当你在f1上你JOIN你得到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 
+0

编辑我原来的职位。 – TheDon 2013-03-01 12:08:40

+0

@TheDon您可以显示表格中的数据(至少是一些例子)吗? – Dukeling 2013-03-01 12:10:21

+0

@TheDon请参阅编辑。 – Dukeling 2013-03-04 07:45:19

相关问题