用于SQL查询的分组依据和排序依据

时间:2018-08-14 18:22:10

标签: sql group-by sql-order-by

我正在尝试生成一个报告,以显示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;

1 个答案:

答案 0 :(得分:1)

您似乎知道,当查询中存在GROUP BY子句时,选择列表中的任何列都必须位于以下任一位置:

  • A-聚合函数
  • B-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_EXPENSEGROUP BY,因为它们已在聚合函数中使用。

也许在MAXx.er_user_full_name中都添加类似x.er_user_location的函数,而在x.er_employee_number列表中仅保留GROUP BY会为您提供所需的结果。请注意,只要MAXx.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