2016-08-23 7 views
0

私はそうのようなクエリがある:OracleのSQLのカンマで区切られたID

SELECT 
    s.id, 
    CASE 
    WHEN INSTR(s.strain_value, '[') = 0 
    THEN s.strain_name 
    ELSE TRIM(SUBSTR(s.strain_name, 1, INSTR(s.strain_name, '[')-1)) 
    END AS strain_name 
FROM strain s 

はこれが私のように見えるテーブルを与える:

id  strain_name 
---------------------------------------------- 
100  CD-1 
101  CD-1 
102  CD-1 
200  SCID 
300  BusIp-hy 
301  BusIp-hy 
...  ... 

今、私はグループにstrain_nameことで結果の表を望んでいましたそして、次のようにカンマで区切ったidを得る:

id    strain_name 
---------------------------------------------- 
100, 101, 102 CD-1 
200    SCID 
300, 301  BusIp-hy 
...    ... 

私はこのクエリを試してみたが、私はありませんよtは私が欲しかったものを得る:

WITH q AS (
    SELECT 
    s.id, 
    CASE 
     WHEN INSTR(s.strain_name, '[') = 0 
     THEN s.strain_name 
     ELSE TRIM(SUBSTR(s.strain_name, 1, INSTR(s.strain_name, '[')-1)) 
    END AS strain_name 
    FROM strain s 
) 
SELECT (
    SELECT LISTAGG(id, ', ') 
    WITHIN GROUP (
    ORDER BY strain_name ASC 
) 
    FROM (SELECT DISTINCT strain_name FROM q) dc 
) AS id, strain_name 
FROM q 

あなたは、私は、各strain_nameについてidのカンマ区切りのリストを取得することができるように、私は最後のクエリを修正する助けてくださいことはできますか?

答えて

2
WITH q (id, strain_name) AS (
    SELECT id, 
     CASE WHEN INSTR(strain_value, '[') = 0 
       THEN strain_name 
       ELSE TRIM(SUBSTR(strain_name, 1, INSTR(strain_name, '[')-1)) 
     END 
    FROM strain 
) 
SELECT LISTAGG(id, ', ') WITHIN GROUP (ORDER BY id) AS id, 
     strain_name 
FROM q 
GROUP BY strain_name 
+0

おかげで、これは私のために動作します。なぜあなたが 'ORDER BY'を' strain_name'から 'id'に変更しなければならないのか疑問に思っていますか? –

+1

@PatrickGregorio期待どおりの結果から、カンマ区切りのIDを昇順に並べ替えたいと思うようです。 'LISTAGG'の' ORDER BY'はグループの中にありますので、すべての項目は同じ 'strain_name'を持ちます(group by節であるため) - 順序を使用することで[非決定論的順序付け] (http://stackoverflow.com/q/35747417/1509264)、 'id'の値はすべて異なっているように見え、決定的な順序になります。 – MT0

2

GROUP BYを試しましたか?

WITH q AS (
... 
) 
SELECT strain_name, listagg(id, ', ') within GROUP(ORDER BY id) 
FROM q 
GROUP BY strain_name 
ORDER BY strain_name 
2
WITH q AS (
    SELECT 
    s.id, 
    CASE 
     WHEN INSTR(s.strain_name, '[') = 0 
     THEN s.strain_name 
     ELSE TRIM(SUBSTR(s.strain_name, 1, INSTR(s.strain_name, '[')-1)) 
    END AS strain_name 
    FROM strain s 
) 
SELECT LISTAGG(id, ', ') WITHIN GROUP (ORDER BY id ASC) as id, q.strain_name 
    FROM q 
group by q.strain_name 
関連する問題