我有下表 Tble :
姓名 | 等级 -------------- n1 | L1 n1 | L2 n2 | L1 n2 | L3 n3 | L1 n4 | L3
我怎样才能编写一个 SQL 查询来输出这样的结果?
姓名 | 等级 ---------------- 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
或 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
假设 MySQL:
SELECT Name, GROUP_CONCAT(Level SEPARATOR "_") Level
FROM tbl
GROUP BY Name
结果
| 姓名 | 水平 | ---------------- | 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