我正在尝试生成一个报告,以显示18财年每个员工的费用报告(ER)以及这些报告的总数。我现在拥有的结果集有几个重复的UIN号-这是员工的标识ID号。每个UIN应该只有一个记录。我以为它与Group By和Order By子句有关,但不确定。有人可以指出问题区域吗?这是SQL:
select x.er_employee_number "UIN",
x.er_user_full_name,
x.er_user_location,
count(X.ER_DOCUMENT_ID) "Number of ERs",
sum(X.ER_TOTAL_EXPENSE) "ER Total"
from INFOR.ALER_EXPENSE_EXPORT_HEADER@TEMPROD x
where X.EXPORT_HDR_STATUS like '4'
and X.ER_PURPOSE like 'Employee%'
and NEW_TIME(X.EXPORT_HDR_STATUS_DATETIME, 'GMT', 'CST') > to_date('1-Jul-2017')
and NEW_TIME(X.EXPORT_HDR_STATUS_DATETIME, 'GMT', 'CST') < to_date('30-Jun-2018')
group by x.er_employee_number,
x.er_user_full_name,
x.er_user_location,
X.ER_DOCUMENT_ID,
X.ER_TOTAL_EXPENSE;
答案 0 :(得分:1)
您似乎知道,当查询中存在GROUP BY
子句时,选择列表中的任何列都必须位于以下任一位置:
GROUP BY
列表当指定多列时,您可能不完全了解GROUP BY
子句的行为。 This answer很好地说明了这一点。本质上,该查询正在创建组,其中每个记录包含相同的x.er_employee_number, x.er_user_full_name, x.er_user_location, X.ER_DOCUMENT_ID, AND X.ER_TOTAL_EXPENSE
。这可能是导致重复的原因。
按原样,您可以从X.ER_DOCUMENT_ID
列表中删除X.ER_TOTAL_EXPENSE
和GROUP BY
,因为它们已在聚合函数中使用。
也许在MAX
和x.er_user_full_name
中都添加类似x.er_user_location
的函数,而在x.er_employee_number
列表中仅保留GROUP BY
会为您提供所需的结果。请注意,只要MAX
和x.er_user_full_name
都是唯一的,并且每个x.er_user_location
都不为空,则x.er_employee_number
函数将不会执行任何操作。
select x.er_employee_number "UIN",
MAX(x.er_user_full_name),
MAX(x.er_user_location),
count(X.ER_DOCUMENT_ID) "Number of ERs",
sum(X.ER_TOTAL_EXPENSE) "ER Total"
from INFOR.ALER_EXPENSE_EXPORT_HEADER@TEMPROD x
where X.EXPORT_HDR_STATUS like '4'
and X.ER_PURPOSE like 'Employee%'
and NEW_TIME(X.EXPORT_HDR_STATUS_DATETIME, 'GMT', 'CST') > to_date('1-Jul-2017')
and NEW_TIME(X.EXPORT_HDR_STATUS_DATETIME, 'GMT', 'CST') < to_date('30-Jun-2018')
group by x.er_employee_number