3

我想在一列中显示所有值。我该怎么做?

数据如下所示:

-----------------------------------------------
| user_id | degree_fi | degree_en | degree_sv |
-----------------------------------------------
| 3601464 | 3700      |  1600     |  2200     |
|  1020   | 100       |  0        |   0       |
| 3600520 |  100      | 1300      |  1400     |
| 3600882 |  0        |   100     |  200      |
| 3600520 |  3200     |   800     |  600      |
| 3600520 |  400      | 3000      |  1500     |
-----------------------------------------------

我想要的是这样的:

-------------------------------------------------------------
| user_id | degree_fi    | degree_en       | degree_sv       |
--------------------------------------------------------------
| 3601464 | 3700         |  1600           |  2200           |
|  1020   | 100          |  0              |   0             |
| 3600520 | 100,3200,400 | 1300, 800, 3000 | 1400, 600, 1500 |
| 3600882 |  0           |   100           |  200            |
--------------------------------------------------------------

如您所见,3600520 的值不仅在一组中,而且也在一列中。我该怎么做?

提前致谢

create table USER_MULTI_DEGREE
(
  USER_ID   INTEGER not null,
  DEGREE_FI VARCHAR2(128),
  DEGREE_EN VARCHAR2(128),
  DEGREE_SV VARCHAR2(128)
);
insert into USER_MULTI_DEGREE (USER_ID, DEGREE_FI, DEGREE_EN, DEGREE_SV) values (3601464, '3700', '1600', '2200');
insert into USER_MULTI_DEGREE (USER_ID, DEGREE_FI, DEGREE_EN, DEGREE_SV) values (1020, '100', '0', '0');
insert into USER_MULTI_DEGREE (USER_ID, DEGREE_FI, DEGREE_EN, DEGREE_SV) values (3600520, '100', '1300', '1400');
insert into USER_MULTI_DEGREE (USER_ID, DEGREE_FI, DEGREE_EN, DEGREE_SV) values (3600882, '0', '100', '200');
insert into USER_MULTI_DEGREE (USER_ID, DEGREE_FI, DEGREE_EN, DEGREE_SV) values (3600520, '3200', '800', '600');
insert into USER_MULTI_DEGREE (USER_ID, DEGREE_FI, DEGREE_EN, DEGREE_SV) values (3600520, '400', '3000', '1500');
4

3 回答 3

5

如果您使用的是 11g R2,则可以使用内置的 listagg() 函数:

select user_id, listagg(degree_fi, ',') within group (order by degree_fi)
from user_Multi_degree
group by user_id 

如果您使用的是 11g R1,则必须为此定义自己的类型 - 请参阅AskTom:stragg 函数以获取示例。

于 2012-07-18T10:43:23.297 回答
1

由于您使用的是 11g,并且假设它是 11gR2,因此您可以使用内置listagg()函数;这是对弗兰克施密特的回答略有变化的分析版本:

select distinct user_id,
    listagg(degree_fi, ',') within group (order by degree_id)
        over (partition by user_id) as degree_fi,
    listagg(degree_en, ',') within group (order by degree_id)
        over (partition by user_id) as degree_en,
    listagg(degree_sv, ',') within group (order by degree_id)
        over (partition by user_id) as degree_sv
from user_multi_degree;

   USER_ID DEGREE_FI            DEGREE_EN            DEGREE_SV
---------- -------------------- -------------------- --------------------
      1020 100                  0                    0
   3600520 100,3200,400         1300,800,3000        1400,600,1500
   3600882 0                    100                  200
   3601464 3700                 1600                 2200
于 2012-07-18T10:58:48.507 回答
0

为您的 SQL 创建和使用内联函数。根据表的大小,它可能会导致性能问题。如果是这种情况,您也可以考虑使用物化视图。

忘了 -的LISTAGG 功能。

11g 第 2 版中的 listagg 函数

于 2012-07-18T10:34:01.873 回答