sql - SQL 分组的结果不符合预期

标签 sql oracle group-by

简介详情:

我在使用客户端 12c 查询 Oracle SQL Developer 时遇到问题。我已经研究了其他几个关于 SO 的问题,并在谷歌上搜索了这个问题的答案,但最终所有问题的答案都是在 GROUP BY 中包含所有没有聚合函数的列。条款。

我想要的是每年、每周和每天(分别为 PG.CATFD.YEARFD.WEEK)为每个类别 (FD.DT) 获取一个结果。我想对单位、小时数、错误 ( GE.QTY) 和总小时数求和。我还在两列上执行乘法和除法,并连接最多四个其他表。

查询:

`SELECT 
  FD.YEAR, 
  FD.WEEK, 
  PG.DT, 
  PG.CAT, 
  SUM(PG.UNITS) AS UNITS, 
  SUM(PG.HOURS) AS HOURS, 
  PM.MTM,
  PM.MTM * PG.HOURS AS ADJ_MTM,
  (PG.UNITS / (PM.MTM * PG.HOURS)) AS PERC_STANDARD,
  SUM(CASE WHEN GE.QTY IS NULL THEN 0 ELSE GE.QTY END) AS QTY,
  SUM(WH.TOTALHOURS) AS TOTALHOURS 
FROM 
  PROD_GUNS PG 
INNER JOIN PROD_MTM PM 
  ON PG.CAT = PM.CATEGORY 
  AND PM.DEPTNO = '018' 
  AND PG.DT BETWEEN PM.START_DT AND PM.END_DT 
INNER JOIN FISCAL_DATES_DAYS FD 
  ON PG.DT = FD.DT 
LEFT OUTER JOIN PROD_GUNS_ERRORS GE 
  ON PG.EID = GE.EID 
  AND PG.DT = GE.DT 
INNER JOIN WEEKLY_HOURS WH
  ON FD.WEEK = WH.DT_WEEK
  AND FD.YEAR = WH.DT_YEAR
  AND PG.EID = WH.EEXX31
GROUP BY 
  FD.YEAR, 
  FD.WEEK, 
  PG.DT, 
  PG.CAT, 
  PM.MTM,
  PM.MTM * PG.HOURS,
  (PG.UNITS / ( PM.MTM * PG.HOURS)) 
HAVING 
  FD.YEAR = '2015' 
  AND FD.WEEK = '1' 
  AND PG.DT = '29-DEC-14' 
  AND PG.CAT = 'Picking'
ORDER BY 
  PG.DT;`

实际结果:

2015    1   29-DEC-14   Picking 46  0.5  68 34      1.35294117647058823529411764705882352941    0   32.21
2015    1   29-DEC-14   Picking 831 7.72 68 524.96  1.58297775068576653459311185614142029869    0   29.35

预期结果:

2015    1   20-Dec-14   Picking 877 8.22 68 558.96   1.21654501216545     0     61.59

问题:

使用上面的聚合和分组,为什么这不会给我预期的结果?预先感谢大家提供的任何指导。

最佳答案

尝试 SUM/AVG(取决于您的需要)PM.MTM * PG.HOURS AS ADJ_MTM 和 (PG.UNITS/(PM.MTM * PG.HOURS)) AS PERC_STANDARD,而不是按它们分组:

SELECT 
  FD.YEAR, 
  FD.WEEK, 
  PG.DT, 
  PG.CAT, 
  SUM(PG.UNITS) AS UNITS, 
  SUM(PG.HOURS) AS HOURS, 
  PM.MTM,
  SUM(PM.MTM * PG.HOURS )AS ADJ_MTM,
  SUM((PG.UNITS / (PM.MTM * PG.HOURS))) AS PERC_STANDARD,
  SUM(CASE WHEN GE.QTY IS NULL THEN 0 ELSE GE.QTY END) AS QTY,
  SUM(WH.TOTALHOURS) AS TOTALHOURS 
FROM 
  PROD_GUNS PG 
INNER JOIN PROD_MTM PM 
  ON PG.CAT = PM.CATEGORY 
  AND PM.DEPTNO = '018' 
  AND PG.DT BETWEEN PM.START_DT AND PM.END_DT 
INNER JOIN FISCAL_DATES_DAYS FD 
  ON PG.DT = FD.DT 
LEFT OUTER JOIN PROD_GUNS_ERRORS GE 
  ON PG.EID = GE.EID 
  AND PG.DT = GE.DT 
INNER JOIN WEEKLY_HOURS WH
  ON FD.WEEK = WH.DT_WEEK
  AND FD.YEAR = WH.DT_YEAR
  AND PG.EID = WH.EEXX31
GROUP BY 
  FD.YEAR, 
  FD.WEEK, 
  PG.DT, 
  PG.CAT, 
  PM.MTM 
HAVING 
  FD.YEAR = '2015' 
  AND FD.WEEK = '1' 
  AND PG.DT = '29-DEC-14' 
  AND PG.CAT = 'Picking'
ORDER BY 
  PG.DT;

关于sql - SQL 分组的结果不符合预期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30483340/

相关文章:

mysql - 计算未查看帖子的数量

oracle - ora_database_name 和 sys_context ('userenv' ,'service_name' 之间有什么区别)

c# - 具有两个分组的 LINQ

mysql - 第一次选择和第二次选择的值不同(UNION AND GROUP BY)

mysql - 如何在 MySQL 中使用聚合和 UNION 解决此问题?

MySQL 按月将日期范围拆分为行

sql - 如何在 PostgreSQL 中使用 LOWER 创建 GIN 索引?

sql - 如果 SQL 中的值重复,如何使 select 语句返回 "NULLs"

database - Oracle数据库软件包的编译历史和错误记录

sql - 比较 SQL Server 和 ORACLE 中日期的常用 SQL