listagg函数失败

时间:2012-08-02 11:12:53

标签: sql oracle oracle11g plsqldeveloper

我正在尝试使用listagg作为listagg(select ...)方式,但我想这是不可能的,我想说的方式。

我有一张学位表。

Degree table:
-----------------------------------------------
| 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     |
-----------------------------------------------

然后我有另一张桌子上有这些名字。

codes:
------------------------------
|  degree_code |  degree_text|
------------------------------
|   3700       |  Masters    |
|   100        | Bachelors   |
|   3200       | Doctorate   |
|   400        |  Diploma A  |
|   1600       | High school |
|   1300       | Secondary   |
|   800        | Post doc    |
|   3000       | Training    |
|   2200       | LLB         |
|   1400       | M.Sc        |
|   200        |  B.Sc       |
|   600        | Foreign Dip |
|   1500       | Failure     |
------------------------------

我想拥有的是这样的:

--------------------------------------------------------------------------------------------------------------------------------------------------------------
 | user_id | degree_fi    | degree_fi_txt                   | degree_en       | degree_en_txt                  |degree_sv        | degree_sv_txt              |
 --------------------------------------------------------------------------------------------------------------------------------------------------------------
 | 3601464 | 3700         | Masters                         | 1600            |  high school                   |  2200           |   LLB                      |
 |  1020   | 100          | Bachelors                       | 0               |                                |   0             |                            |
 | 3600520 | 100,3200,400 | Bachelors, Doctorate, Diploma A | 1300, 800, 3000 |  secondary, post doc, Training | 1400, 600, 1500 | M.Sc, Foreign Dip, Failure | 
 | 3600882 |  0           |                                 | 100             |  Bachelors                     |  200            |   B.Sc                     |
  -------------------------------------------------------------------------------------------------------------------------------------------------------------

我试过像这样使用listagg函数:

SELECT user_id, listagg(degree_fi, ',') within GROUP (ORDER BY degree_fi) degree_fi,
                listagg(SELECT degree_text from codes WHERE degree_code IN (SELECT degree_fi feom degree), ',') within GROUP (ORDER BY degree_text) degree_fi_txt,
                listagg(degree_en, ',') within GROUP (ORDER BY degree_en) degree_en,
                listagg(SELECT degree_text from codes WHERE degree_code IN (SELECT degree_en feom degree), ',') within GROUP (ORDER BY degree_text) degree_en_txt,
                listagg(degree_sv, ',') within GROUP (ORDER BY degree_en) degree_sv
                listagg(SELECT degree_text from codes WHERE degree_code IN (SELECT degree_sv feom degree), ',') within GROUP (ORDER BY degree_text) degree_sv_txt,
FROM  degree GROUP BY user_id

但我正在用它撞墙。 有什么建议吗?

提前致谢。

1 个答案:

答案 0 :(得分:3)

您只需要加入codes表三次,而不是使用select中的listagg

SELECT user_id,
    listagg(d.degree_fi, ',')
        WITHIN GROUP (ORDER BY d.degree_fi) degree_fi,
    listagg(cf.degree_text, ',')
        WITHIN GROUP (ORDER BY d.degree_fi) degree_fi_txt,
    listagg(d.degree_en, ',')
        WITHIN GROUP (ORDER BY d.degree_en) degree_en,
    listagg(ce.degree_text, ',')
        WITHIN GROUP (ORDER BY d.degree_en) degree_en_txt,
    listagg(d.degree_sv, ',')
        WITHIN GROUP (ORDER BY d.degree_sv) degree_sv,
    listagg(cs.degree_text, ',')
        WITHIN GROUP (ORDER BY d.degree_sv) degree_sv_txt
FROM degree d
LEFT JOIN codes cf on cf.degree_code = d.degree_fi
LEFT JOIN codes ce on ce.degree_code = d.degree_en
LEFT JOIN codes cs on cs.degree_code = d.degree_sv
GROUP BY d.user_id
ORDER BY d.user_id;


   USER_ID DEGREE_FI            DEGREE_FI_TXT                  DEGREE_EN            DEGREE_EN_TXT                  DEGREE_SV            DEGREE_SV_TXT
---------- -------------------- ------------------------------ -------------------- ------------------------------ -------------------- ------------------------------
      1020 100                  Bachelors                      0                                                   0
   3600520 100,400,3200         Bachelors,Diploma A,Doctorate  800,1300,3000        Post doc,Secondary,Training    600,1400,1500        Foreign Dip,M.Sc,Failure
   3600882 0                                                   100                  Bachelors                      200                  B.Sc
   3601464 3700                 Masters                        1600                 High school                    2200                 LLB

我不确定您是否希望degree_text值按字母顺序排序,或者匹配ID的顺序;我已经选择了后者,但如果你想要前者,你可以将order by更改为cf.degree_text等。

相关问题