-2

私は次のテーブルTbleを持っています:

名前| レベル
--------------
n1 | L1
n1 | L2
n2 | L1
n2 | L3
n3 | L1
n4 | L3

そのような出力をするSQLクエリをどのように書くことができますか?

名前| レベル  
--------------------------------
n1 | L1_L2
n2 | L1_L3
n3 | L1
n4 | L3

ありがとうございました

4

4 に答える 4

1

MySQL の場合:

SELECT Name, GROUP_CONCAT(Level SEPARATOR "_") Level
FROM tbl
GROUP BY Name

結果

| | 名前 | レベル |
----------------
| | n1 | L1_L2 |
| | n2 | L1_L3 |
| | n3 | L1 |
| | n4 | L3 |

デモを見る

于 2013-03-15T01:56:56.510 に答える
1

質問のタイトルが示すように常に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
于 2013-03-15T02:20:53.670 に答える
0

Oracle 11g R2ソリューションは次のとおりLISTAGGです。

SELECT "Name", LISTAGG("Level", ',') WITHIN GROUP (ORDER BY "Level") "Levels"
FROM Table1 
GROUP BY "Name"
ORDER BY "Name"; 

SQL フィドル

于 2013-03-15T02:44:35.423 に答える
0

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

于 2013-03-15T11:14:54.803 に答える