在 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 指标的可观察性

如何在 oracle sql 中使用 max on sum?

Max-pooling VS Sum-pooling

二分图查找匹配

List集合元素的计算排序查找统计

P2627 修剪草坪[dp][单调队列]