oracle sql 多筆資料塞在一列

  • 61
  • 0
  • 2019-12-11

方法使用pivot在DB端處理

sqltest測試:

CREATE TABLE sql_test_a 
( 
    ID         VARCHAR2(4000 BYTE), 
    FIRST_NAME VARCHAR2(200 BYTE), 
    LAST_NAME  VARCHAR2(200 BYTE) 
); 
INSERT INTO sql_test_a (ID, FIRST_NAME, LAST_NAME) VALUES ('1', 'John', 'Snow'); 
INSERT INTO sql_test_a (ID, FIRST_NAME, LAST_NAME) VALUES ('2', 'Mike', 'Tyson'); 
INSERT INTO sql_test_a (ID, FIRST_NAME, LAST_NAME) VALUES ('3', 'Bill', 'Keaton'); 
INSERT INTO sql_test_a (ID, FIRST_NAME, LAST_NAME) VALUES ('4', 'Greg', 'Mercury'); 
INSERT INTO sql_test_a (ID, FIRST_NAME, LAST_NAME) VALUES ('5', 'Steve', 'Jobs'); 

語法:

with sql_test_a_rn as (
    select ID,
           FIRST_NAME,
           LAST_NAME,
           mod(rn - 1, 3) as gorup_id,       /* 分組編號 */
           ceil(rn / 3) as newRownum         /* 分組後新的Rownumber */
      from (select ID,
                   FIRST_NAME,
                   LAST_NAME,
                   row_number() over(order by ID) as rn
              from sql_test_a ) t
)
select c1_ID         as ID_1,
       c1_FIRST_NAME as FIRST_NAME_1,
       c1_LAST_NAME  as LAST_NAME_1,
       c2_ID         as ID_2,
       c2_FIRST_NAME as FIRST_NAME_2,
       c2_LAST_NAME  as LAST_NAME_2,
       c3_ID         as ID_3,
       c3_FIRST_NAME as FIRST_NAME_3,
       c3_LAST_NAME  as LAST_NAME_3
 from sql_test_a_rn
 pivot (
    max(ID) as ID, max(FIRST_NAME) as FIRST_NAME, max(LAST_NAME) as LAST_NAME
    for gorup_id in
    (
        0 as c1, 
        1 as c2, 
        2 as c3
    )
 )
order by newRownum