2013-03-15 150 views
-2

的,我有以下表Tble:SQL查詢Concat的2行同一列

 
Name | Level 
-------------- 
n1 | L1 
n1 | L2 
n2 | L1 
n2 | L3 
n3 | L1 
n4 | L3 

如何我寫一個SQL查詢,這樣的輸出?

 
Name | Level 
---------------- 
n1 | L1_L2 
n2 | L1_L3 
n3 | L1 
n4 | L3 

謝謝

+0

什麼[RDBMS](http://en.wikipedia.org/wiki/Relational_database_management_system)您使用的? 'RDBMS'代表*關係數據庫管理系統*。 'RDBMS是SQL'的基礎,並且適用於所有現代數據庫系統,如MS SQL Server,IBM DB2,Oracle,MySQL等... – 2013-03-15 01:53:46

+0

hsqldb + oracle。有沒有一種獨立於rdbms的方式? – Fab 2013-03-15 01:57:56

回答

1

假設MySQL的:

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

結果

| NAME | LEVEL | 
---------------- 
| n1 | L1_L2 | 
| n2 | L1_L3 | 
| n3 | L1 | 
| n4 | L3 |

See the demo

+0

不錯!那麼這隻會在MySQL中起作用? – Fab 2013-03-15 02:01:02

+0

@Fab這是正確的;你在使用什麼平臺? – Kermit 2013-03-15 02:01:27

+0

實際上HSQLDB和ORACLE – Fab 2013-03-15 02:04:04

1

小號o如果它總是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中,您可以使用LISTAGG如果每名超過2行:

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 
0

這裏是甲骨文11克R2解決方案:使用LISTAGG

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

SQL Fiddle