0

私の SQL スキルはさび付いており、Google で調べても、これを理解することはできません。どんな助けにも感謝します。

私は典型的な注文関連のフィールドを持つ注文テーブルを持っています:注文番号(主キー)、注文番号など。

基本的に、私が達成しようとしているのはこれです: 重複する PO 番号を見つけ、それらが関連している注文番号をリストします。出力は次のようになります。

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

4 に答える 4

3

「複数のPO」の論理は正しいです。重複した 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

wm_concat次の関数を使用できます。

select
  PO,
  wm_concat(OrderNumber) AS ORDERS
from orders
group by PO
having count(PO) > 1
于 2013-08-11T02:47:33.283 に答える
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 に答える