2017-09-27 7 views
0

いくつかの値DBから取得が必要です> 「値1、値、... value100」として が、私はもっとそして100個の値が を行う必要がありreciveます場合、 「VALUE1、VALUE2、... value100 ..」それを知るためには、すべての値ではありませんが、私はORACLE SQL LISTAGG私が得る場合と100の以上の結果

select LISTAGG(CASE WHEN ROWNUM <=100 THEN within.number ELSE NULL END,', ') 
     WITHIN GROUP (ORDER BY within.number) 
from ........... 

を使用して、今最大100の値を示すが、私は必要があるとして、それが機能していませんします。

+0

を参照してくださいあなたが使用することができます'overflow'節。 http://modern-sql.com/feature/listagg#syntax集約された要素の数ではなく、結果の文字列の長さに基づいて動作します。 –

答えて

2

あなたはそうのようにこれを行うことができます:私の例では

WITH sample_data AS (SELECT 1 ID, 'a' val FROM dual UNION ALL 
        SELECT 1 ID, 'b' val FROM dual UNION ALL 
        SELECT 1 ID, 'c' val FROM dual UNION ALL 
        SELECT 2 ID, 'd' val FROM dual UNION ALL 
        SELECT 2 ID, 'e' val FROM dual UNION ALL 
        SELECT 2 ID, 'f' val FROM dual UNION ALL 
        SELECT 2 ID, 'g' val FROM dual UNION ALL 
        SELECT 3 ID, 'h' val FROM dual UNION ALL 
        SELECT 3 ID, 'i' val FROM dual UNION ALL 
        SELECT 3 ID, 'h' val FROM dual UNION ALL 
        SELECT 3 ID, 'j' val FROM dual UNION ALL 
        SELECT 3 ID, 'k' val FROM dual UNION ALL 
        SELECT 4 ID, 'l' val FROM dual UNION ALL 
        SELECT 4 ID, 'm' val FROM dual UNION ALL 
        SELECT 5 ID, 'n' val FROM dual) 
SELECT ID, 
     listagg(CASE WHEN rn <= 3 THEN val ELSE '...' END, ',') WITHIN GROUP (ORDER BY val) vals 
FROM (SELECT ID, 
       val, 
       row_number() OVER (PARTITION BY ID ORDER BY val) rn 
     FROM sample_data) 
WHERE rn <= 4 -- max amount of expected elements + 1 
GROUP BY ID; 

ID VALS 
--- ----------- 
    1 a,b,c 
    2 d,e,f,... 
    3 h,h,i,... 
    4 l,m 
    5 n 

を、私は利用可能な他の要素がある場合と、「...」に沿ってちょうど3つの要素が、表示したいです。最初に、各IDの最初の4行だけに結果をフィルタリングします。

これを行うには、ROW_NUMBER分析関数を使用して、各行の昇順のval順に番号を付けます。

行番号が分かれば、期待される要素数+1を返すように行をフィルタリングすることができます。余分な行があるかどうかを知るために必要です。私の場合は、最初の4行を取得する必要があるということです。

次に、最初の3つの要素の実際の値を出力するcase文と、存在する場合は4番目の要素の "..."が必要です。

次に、それをLISTAGGとVOILAに組み込むことができます。もちろん


、上記のデータベースがバージョン12.2ではないことを前提として - それはされている場合は、新しいオーバーフローの機能強化を活用することができます - Oracleの12.2以来here for more information

関連する問題