-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

因此,如果您的问题标题所暗示的始终是 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

或 10 克:

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 回答
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 回答
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 回答