【发布时间】:2015-03-11 04:17:55
【问题描述】:
我正在尝试修复继承代码中的错误。此查询旨在带回amex_meal_amount_total of $33,但它提供$99。问题在于第二个连接 - EE table 中有三个关联项,这使得聚合总计三行。
SELECT ER.report_id,
Isnull(Sum(EE_AMEX.meal_amount), 0) AS amex_meal_amount_total
FROM expense_report ER (nolock)
LEFT OUTER JOIN expense_expense EE_AMEX (nolock)
ON ER.report_id = EE_AMEX.report_id
AND EE_AMEX.line_item_type_id = 1
LEFT OUTER JOIN expense_expense EE_OOP (nolock)
ON ER.report_id = EE_OOP.report_id
AND EE_OOP.line_item_type_id = 2
WHERE er.report_id = 9733
GROUP BY ER.report_id
我很清楚,开发人员试图在连接中使用表别名(例如 EE_AMEX)来将sum 函数限制为连接中的条件。
EE table 中只有一行 line_item_type_id 1 用于此 ID。当我删除另一个 join 语句时,它会带回预期的 $33。
SELECT ER.report_id,
Isnull(Sum(EE_AMEX.meal_amount), 0) AS amex_meal_amount_total
FROM expense_report ER (nolock)
LEFT OUTER JOIN expense_expense EE_AMEX (nolock)
ON ER.report_id = EE_AMEX.report_id
AND ee_oop.line_item_type_id = 1
WHERE er.report_id = 9733
GROUP BY ER.report_id
是否有直接的解决方法,或者我需要完全重组查询?
表结构:
尽量让这个问题保持简单
费用报告:
report_id (PK)
expense_expense:
report_id(FK,一对多)
餐量(可以是多行,每个报告 ID 的餐量)
Taxi_amount(其他费用示例)
line_item_type_id(1是AMEX,2是OOP,每行可以任意)
在这种情况下,急诊室的费用_费用中有一个相关联的行,餐费为 33 美元,所以这是我所期望的。
但是,其他费用(例如出租车等)有三个相关联的行。
在运行查询时,它会为三行求和,因此是意外的 99 美元。
谢谢。
【问题讨论】:
-
为什么在没有使用该表的情况下加入 oop?
-
第一个查询中的左连接类似于 ER.report_id = EE_AMEX.report_id AND (EE_OOP.line_item_type_id = 1 OR EE_OOP.line_item_type_id = 2)。你在第二个查询中得到了结果。
-
@Giorgi Nakeuri,出于示例目的,我没有包含完整的查询,它也从 EE_OOP 检索聚合。谢谢
-
能否提供表结构、当前结果集和预期结果集(不是99和33,而是结果应该是什么样子)?
-
表结构和更多添加。谢谢。
标签: sql-server left-join aggregate-functions