私は次のテーブルTbleを持っています:
名前| レベル -------------- n1 | L1 n1 | L2 n2 | L1 n2 | L3 n3 | L1 n4 | L3
そのような出力をするSQLクエリをどのように書くことができますか?
名前| レベル -------------------------------- n1 | L1_L2 n2 | L1_L3 n3 | L1 n4 | L3
ありがとうございました
MySQL の場合:
SELECT Name, GROUP_CONCAT(Level SEPARATOR "_") Level
FROM tbl
GROUP BY Name
結果
| | 名前 | レベル | ---------------- | | n1 | L1_L2 | | | n2 | L1_L3 | | | n3 | L1 | | | n4 | L3 |
質問のタイトルが示すように常に2行の場合は、次のようにします。
SQL> select name,
2 case
3 when min(lvl)=max(lvl) then min(lvl)
4 else min(lvl)||'_'||max(lvl)
5 end lvl
6 from data group by name
7 order by name;
NA LVL
-- -----
n1 L1_L2
n2 L1_L3
n3 L1
n4 L3
11g では、名前ごとに 2 行を超える場合、listagg を使用できます。
SQL> select name,
2 listagg(lvl, '_') within group (order by lvl) lvl
3 from data
4 group by name
5 order by name;
NA LVL
-- --------------------
n1 L1_L2
n2 L1_L3
n3 L1
n4 L3
または10gで:
SQL> select name,
2 replace(wm_concat(lvl), ',', '_') lvl
3 from data
4 group by name
5 order by name;
NA LVL
-- --------------------
n1 L1_L2
n2 L1_L3
n3 L1
n4 L3
Oracle 11g R2ソリューションは次のとおりLISTAGG
です。
SELECT "Name", LISTAGG("Level", ',') WITHIN GROUP (ORDER BY "Level") "Levels"
FROM Table1
GROUP BY "Name"
ORDER BY "Name";
HSQLDB は MySQL と同じ構文をサポートしますが、文字列定数に SQL 標準の単一引用符を使用します。
SELECT "Name", GROUP_CONCAT("Level" ORDER BY "Level" SEPARATOR '_') "Level"
FROM "Tbl"
GROUP BY "Name"
ORDER BY "Name"
この例では、大/小文字混合の表名と列名を引用符で囲んでいると想定しています。
http://www.hsqldb.org/doc/2.0/guide/dataaccess-chapt.html#dac_aggregate_funcs