在 SUM WinSQL 之后查找 MAX - 项目数量最多的分支
Posted
技术标签:
【中文标题】在 SUM WinSQL 之后查找 MAX - 项目数量最多的分支【英文标题】:FInd MAX after SUM WinSQL- Branch with highest qty for an item 【发布时间】:2016-07-21 20:25:59 【问题描述】:下面的链接是一个关闭的案例,但是这段代码不起作用,我也想不通 -> using max() and sum()
甲骨文信息:
Oracle 数据库 11g 企业版版本 11.2.0.2.0 - 64 位生产 PL/SQL 版本 11.2.0.2.0 - 生产 核心 11.2.0.2.0 生产 适用于 Linux 的 TNS:版本 11.2.0.2.0 - 生产 NLSRTL 版本 11.2.0.2.0 - 生产
我需要从 2 个表中检索特定项目的延期交货最高的分公司。对于每个项目,都有不同的客户,因此每个分支机构的每个项目都有单独的延期订购数量。我需要添加项目 A 的所有数量,并查看哪个分支的退货数量最多。求和然后 MAX...
如果我这样做:
SELECT BRANCH, ITEM, MAX(QTY) AS LEQTY
FROM
(
SELECT BRANCH, ITEM, SUM(QTY) AS LEQTY
FROM TABLE1
GROUP BY BRANCH, ITEM
UNION ALL
SELECT BRANCH, ITEM, SUM(QTY) AS LEQTY
FROM TABLE2
GROUP BY BRANCH, ITEM
)
WHERE ITEM = 'XYZ'
GROUP BY BRANCH, ITEM
我明白了: (数量是每个分支的总和)
BRANCH ITEM QTY
------ ---- ---
BRANCH1 XYZ 3
BRANCH2 XYZ 0
BRANCH3 XYZ 4
BRANCH4 XYZ 21
但我需要:
BRANCH ITEM QTY
------ ---- ---
BRANCH4 XYZ 21
也尝试过(仅使用 1 个表作为示例):
SELECT BRANCH, ITEM, MAX(QTY)
FROM TABLE1
WHERE QTY = (SELECT SUM(QTY)
FROM TABLE1
WHERE ITEM = 'XYZ'
)
AND ITEM = 'XYZ'
GROUP BY BRANCH, ITEM
它给了我一条线,但它是错误的。
最后,我想出了这个:
SELECT A.BRANCH, A.ITEM, MAX(A.QTY) AS ITEM
FROM TABLE1 A, (SELECT BRANCH, ITEM, SUM(QTY) AS LEQTY
FROM TABLE1
GROUP BY BRANCH, ITEM) B
WHERE A.BRANCH = B.BRANCH
AND MAX(B.QTY)
GROUP BY A.BRANCH, A.ITEM
这给了我一个 ORA-00934
我错过了什么?
谢谢
【问题讨论】:
为什么要计数 21 而不是 25? 只是一个猜测,但我处理过的大多数 RDBMS 都不允许在 WHERE 子句中引用聚合函数。 (对应于google上出现的“Group function not allowed here”的错误描述) @GordonLinoff 我将相同的商品卖给不同分支机构的不同客户。对于每一个分支,对于同一个项目,会有不同的数量进行汇总。对于 Branch4,来自 3 个客户的总数为 21 件(客户 A 延期交货 = 1 件,客户 B = 11 件,客户 C = 9 件)。我想知道这个分支的所有延期交货数量的总和。这是 21。然后比较每个分支的相同项目的每个总数。所以我们得到 3、0、4、21。然后,我想看看哪个分支的项目最多。在这种情况下,分支 4。因此有 21 个项目。你从哪里得到的 25? @Uueerdo 谢谢,我会尝试别的:) 【参考方案1】:在 Oracle 12c+ 中,您可以:
SELECT BRANCH, ITEM, MAX(QTY) AS LEQTY
FROM ((SELECT BRANCH, ITEM, SUM(QTY) AS LEQTY
FROM TABLE1
GROUP BY BRANCH, ITEM
) UNION ALL
(SELECT BRANCH, ITEM, SUM(QTY) AS LEQTY
FROM TABLE2
GROUP BY BRANCH, ITEM
)
) bi
WHERE ITEM = 'XYZ'
GROUP BY BRANCH, ITEM
ORDER BY MAX(QTY) DESC
FETCH FIRST 1 ROW ONLY;
在早期版本中:
SELECT BRANCH, ITEM, LEQTY
FROM (SELECT BRANCH, ITEM, MAX(QTY) AS LEQTY, rownum as rn
FROM ((SELECT BRANCH, ITEM, SUM(QTY) AS LEQTY
FROM TABLE1
GROUP BY BRANCH, ITEM
) UNION ALL
(SELECT BRANCH, ITEM, SUM(QTY) AS LEQTY
FROM TABLE2
GROUP BY BRANCH, ITEM
)
) bi
WHERE ITEM = 'XYZ'
GROUP BY BRANCH, ITEM
ORDER BY MAX(QTY) DESC
) bi
WHERE rn = 1;
【讨论】:
对于较新的版本,我得到 ORA-00933。尝试使用 (),然后使用 ORA-00903。对于早期版本的解决方案,我得到 ORA-00935 或 ORA-00904 所以基于 -> ' select * from v$version ' 我正在运行一个错误的版本 11.2 @katjua。 . .我在第一个查询中没有发现任何问题。您使用的是什么版本的 Oracle? @GordonLinhoff 我使用的是 11.2【参考方案2】:好的,所以我能够使用它
SELECT
branch, item, BO_qty
FROM
(SELECT
branch, item, SUM(BO_qty) AS sum_bo
FROM
(SELECT
branch, item, SUM(BO_qty) AS sum_bo
FROM
t1
GROUP BY
branch, item
UNION ALL
SELECT
branch, item, SUM(BO_qty) AS sum_bo
FROM
t2
GROUP BY
branch, item
)
GROUP BY
branch,
item
ORDER BY
BO_qty DESC
)
WHERE
ROWNUM=1
返回
BRANCH ITEM QTY
------ ---- ---
BRANCH4 XYZ 21
【讨论】:
我认为这基本上是我回答中的第二个查询。 @GordonLinoff 是的,你是对的。除了我最后不得不取出MAX,因为它造成了麻烦。你让我走上了正确的轨道,所以谢谢你:)以上是关于在 SUM WinSQL 之后查找 MAX - 项目数量最多的分支的主要内容,如果未能解决你的问题,请参考以下文章
Spring Boot - *max_count *sum 指标的可观察性