2013-02-28 54 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

相關問題