0

我的 SQL 技能生疏了,尽管谷歌搜索,我还是不太明白这一点。我会感谢任何帮助。

我有一个订单表,其中包含典型的订单相关字段:订单号(主键)、采购订单号等。

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

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

到目前为止,我已经提出了一个查询,可以找到重复的采购订单编号及其出现,但我无法弄清楚订单列表部分。

SELECT PO,COUNT(PO) AS OCCURRENCES
FROM ORDERS
GROUP BY PO
HAVING COUNT(PO) > 1

顺便说一句,这是甲骨文,如果它有什么不同的话(除了我生疏的技能之外,我是新手,啊!)。谢谢您的帮助!

4

4 回答 4

3

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

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

要查看 LISTAGG 的文档,请单击此处

于 2013-08-11T02:43:02.227 回答
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

那行得通吗?

于 2013-08-11T02:38:46.853 回答
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
       )
于 2013-08-11T02:44:12.750 回答
0

您可以使用以下wm_concat功能:

select
  PO,
  wm_concat(OrderNumber) AS ORDERS
from orders
group by PO
having count(PO) > 1
于 2013-08-11T02:47:33.283 回答