带有额外列的GROUP BY查询

时间:2013-08-11 02:35:50

标签: sql oracle group-by aggregation string-concatenation

我的SQL技能很生疏,尽管谷歌搜索我还不能理解这一点。我会感谢任何帮助。

我有一个订单表,包含典型的订单相关字段:订单#(这是主键),采购订单#等。

基本上,我想要实现的目标是:找到重复的采购订单编号,并列出订单编号与它们相关。输出应该类似于:

PO #   |   ORDERS
-----------------
1234   | qwerty, abc
-----------------
1235   | xyz, def

到目前为止,我已经提出了一个查找重复的PO编号及其出现次数的查询,但我无法找出订单列表部分。

SELECT PO,COUNT(PO) AS OCCURRENCES
FROM ORDERS
GROUP BY PO
HAVING COUNT(PO) > 1
顺便说一句,这是甲骨文,如果它有任何区别(除了我生锈的技能之外我还是新手,唉!)。谢谢你的帮助!

4 个答案:

答案 0 :(得分:3)

您对“多个PO”的逻辑是正确的。如果您希望重复PO的订单号位于以逗号分隔的列表中,LISTAGG function将起作用:

SELECT
  PO,
  LISTAGG(OrderNumber, ',') WITHIN GROUP (ORDER BY OrderNumber) AS OrderNums
FROM ORDERS
GROUP BY PO
HAVING COUNT(PO) > 1

查看LISTAGG click here的文档。

答案 1 :(得分:0)

SELECT groups.orders FROM (SELECT PO,COUNT(PO) AS OCCURRENCES
FROM ORDERS
GROUP BY PO
HAVING COUNT(PO) > 1) groups
JOIN orders on orders.po = groups.po

那会有用吗?

答案 2 :(得分:0)

自从我使用Oracle以来已经有一段时间了,但是,我认为这样做会有所帮助:

SELECT PO,
       OCCURENCES,
       ORDERID /* not sure about your column name for order # */
  FROM ORDERS
 WHERE PO IN
       (
           SELECT PO
            FROM ORDERS
        GROUP BY PO
          HAVING COUNT(PO) > 1
       )

答案 3 :(得分:0)

您可以使用wm_concat功能:

select
  PO,
  wm_concat(OrderNumber) AS ORDERS
from orders
group by PO
having count(PO) > 1