当我加入另一个表时,SUM 不正确
Posted
技术标签:
【中文标题】当我加入另一个表时,SUM 不正确【英文标题】:Incorrect SUM when I JOIN another table 【发布时间】:2013-02-28 18:49:43 【问题描述】:我正在尝试对各种总计应用折扣。每个折扣都有自己的折扣代码,因此我想将代码应用于其等效总数。但有时此代码可能会出现不止一次。如果是这样,我想将折扣代码相加以产生一个折扣。
我的第一次尝试是不正确的,但准确地显示了我刚刚试图解释的内容,即。折扣代码出现多次:
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 的“完整”代码:
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 的总折扣。
【问题讨论】:
【参考方案1】:这确实取决于bren_detalle
的外观,但您可能需要在JOIN
上指定一个字段(否则它将基本上是CROSS JOIN
- 一行相互匹配另一个表中的行):
bren_detalle bdet
JOIN bren_descuentos bdto
ON bdet.somefield = bdto.someotherfield
AND bdet.det_unidad_medida = 'megabytes'
请注意,您在第一个查询中得到不需要的结果的原因是 GROUP BY
中的 dto_fac_importe_dto
。这将导致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
然后,当您在 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
【讨论】:
@TheDon 你能展示(至少一些/例子)表格中的数据吗?以上是关于当我加入另一个表时,SUM 不正确的主要内容,如果未能解决你的问题,请参考以下文章
出现错误 `''' 附近的语法不正确。 ` 使用 PHP 创建 MSSQL 表时