id  score
1     55
1      65 
1      80
2      60
2      55
2      88
如何查询出来是
id   s1 s2 s3
1     55 65 80
2     60 55 88

解决方案 »

  1.   


    --我寫的這個有點復雜,等高人幫你寫個簡單的吧
    with t(id,score) as(
    select 1,55 from dual
    union all select 1,65 from dual
    union all select 1,80 from dual
    union all select 2,60 from dual
    union all select 2,65 from dual
    union all select 2,88 from dual
    )
    select
    id,
    max(decode(rn,1,score,0)) s1,
    max(decode(rn,2,score,0)) s2,
    max(decode(rn,3,score,0)) s3
    from (select row_number() over(partition by id order by id) rn,id,score from t) 
    group by id;
    /*
            ID         S1         S2         S3                                     
    ---------- ---------- ---------- ----------                                     
             1         55         65         80                                     
             2         60         65         88   
    */
      

  2.   

    with t(id,score) as(
    select 1,55 from dual
    union all select 1,65 from dual
    union all select 1,80 from dual
    union all select 2,60 from dual
    union all select 2,65 from dual
    union all select 2,88 from dual
    )
    SELECT * FROM (select id as fid,score,row_number()over(partition by id order by id) as rn from t ) t1
    pivot(SUM(score) FOR rn IN (1,2,3))
    FID                    1                      2                      3                      
    ---------------------- ---------------------- ---------------------- ---------------------- 
    1                      55                     65                     80                     
    2                      60                     65                     88                    
      

  3.   

    row_number()over(partition by id order by id) rn 就是
    按id排序 按id 分区 给每一行一个 rn 
    id score rn
    1 55      1
    1 65      2
    1 80      3
    2 60     1
    2 55      2
    2 88      3
    是不是?
      

  4.   

    恩,理解完全正確,一般排序列是score,但你此處的要求是按先後,所以就用了id