如何在Oracle SQL中执行复杂的MAX()和GROUP BY?

时间:2016-11-09 14:51:15

标签: sql oracle oracle10g

我担心2个表AUF_KOPF是订单标题而AUF_POS是订单商品。

我想获得订单中订单商品上使用产品的最长日期。产品ID存储在AUF_POS.GLAS1AUF_POS.GLAS2AUF_POS.GLAS3

我创建了此查询,仅检查AUF_POS.GLAS1

Select Max(AUF_KOPF.ERFASS_DAT),
  AUF_POS.GLAS1
From AUF_KOPF AUF_KOPF
  Inner Join AUF_POS AUF_POS On AUF_KOPF.AUF_NR = AUF_POS.AUF_NR
Group By AUF_POS.GLAS1
Order By AUF_POS.GLAS1

结果:

MAX(AUF_KOPF.ERFASS_DAT)    GLAS1
07/11/2016  1
06/11/2016  2
03/11/2016  3
09/11/2016  4
07/11/2016  5

问题是,产品ID 1可能比订单07/11/2016AUF_POS.GLAS2中的其他位置的AUF_POS.GLAS3更新。

是否可以OR,或者写这个的最佳方法是什么?我想远离3 SELECT,然后将它们合并,因为它看起来很混乱。

示例AUF_KOPF行:

AUF_NR  ERFASS_DAT
1609183 06/01/2016
1609184 06/01/2016
1609185 06/01/2016
1609187 06/01/2016
1609188 06/01/2016

示例AUF_POS行:

AUF_NR  AUF_POS GLAS1   GLAS2   GLAS3
1609183 4   4   9   0
1609184 5   4   9   0
1609185 6   4   9   0
1609187 7   4   9   0
1609188 8   4   9   0

此实例中的所需输出会将所有产品显示为06/01/2016,但如果有更多数据,则会在任何位置显示产品ID的最新日期。

1 个答案:

答案 0 :(得分:2)

您可以使用UNION ALL,这不应该过于复杂(除了较长的代码)

Select Max(AUF_KOPF.ERFASS_DAT),
       AUF_POS.GLAS
From AUF_KOPF
  Inner Join (SELECT AUF_NR,GLAS1 as glas FROM AUF_POS UNION ALL
              SELECT AUF_NR,GLAS2         FROM AUF_POS UNION ALL
              SELECT AUF_NR,GLAS3         FROM AUF_POS) AUF_POS
  On AUF_KOPF.AUF_NR = AUF_POS.AUF_NR
Group By AUF_POS.GLAS
Order By AUF_POS.GLAS