2013-03-15 74 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