如何在 Oracle SQL 中执行复杂的 MAX() 和 GROUP BY?
How to do a complex MAX() and GROUP BY in Oracle SQL?
我关心 2 个表 AUF_KOPF
是订单 header 和 AUF_POS
是订单项目。
我想获得产品在订单中的订单项目上使用的最长最后日期。产品 ID 存储在 AUF_POS.GLAS1
、AUF_POS.GLAS2
或 AUF_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
在订单 AUF_POS.GLAS2
或 AUF_POS.GLAS3
.
的另一个位置可能比 07/11/2016
最近使用过
是否可以做到 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 的最新日期。
您可以使用 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
我关心 2 个表 AUF_KOPF
是订单 header 和 AUF_POS
是订单项目。
我想获得产品在订单中的订单项目上使用的最长最后日期。产品 ID 存储在 AUF_POS.GLAS1
、AUF_POS.GLAS2
或 AUF_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
在订单 AUF_POS.GLAS2
或 AUF_POS.GLAS3
.
07/11/2016
最近使用过
是否可以做到 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 的最新日期。
您可以使用 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