all row values in one column

守給你的承諾、 提交于 2019-12-14 04:27:23

问题


I would like to display all values in one column. How may I do so?

Data looks like this:

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

What I would like to have is this:

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

As you can see that the values of 3600520 are not only in one group but also in one column too. How may I do it?

Thanks in advance

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');

回答1:


If you are using 11g R2, you can use the built-in listagg() function:

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

If you are using 11g R1, you'll have to define your own type for this - see AskTom: stragg function for an example.




回答2:


Since you are on 11g, and assuming it's 11gR2, you can use the built-in listagg() function; this is the analytic version for a slight variation on Frank Schmitt's answer:

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



回答3:


Create and use an inline function for your SQL. Depending on the size of your table it may cause performance issues. If this is the case you might also consider using a materialized view.

Forgot - the new LISTAGG function.

listagg function in 11g release 2



来源:https://stackoverflow.com/questions/11538816/all-row-values-in-one-column

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!