2012-08-16 37 views
13

Tôi có dữ liệu ở định dạng được xoay vòng. Nó trông giống như thế này:Xoay vòng dữ liệu bằng hai cột

----------------------------------------- 
| user_id | org | position | lang | 
----------------------------------------- 
| 1001 | USE | Boss  | EN | 
| 1001 | USD | Bossa  | FI | 
| 1002 | GWR | Dim  | SV | 
| 1003 | GGA | DCS  | FI | 
| 1003 | GCA | DDD  | SV | 
----------------------------------------- 

Tôi muốn có dữ liệu biểu diễn dưới dạng:

------------------------------------------------------------------------------------- 
| user_id | org_fi | position_fi | org_en | position_en | org_sv | position_sv | 
------------------------------------------------------------------------------------- 
| 1001 | USD | Bossa  | USE | Boss  |   |    | 
| 1002 |  |    |   |    | GWR  | Dim  | 
| 1003 | GGA | DCS  |   |    | GCA  | DDD  | 
------------------------------------------------------------------------------------- 

Tôi nghĩ rằng một truy vấn trục với kết nối bằng lệnh là cần thiết.


Đây là những gì tôi đã cố gắng để làm:

SELECT user_id, 
    org, 
    position, 
    lang, 
    ROW_NUMBER() OVER (PARTITION BY lang, user_id ORDER BY ROWID) rn 
FROM source 

Tuy nhiên, tôi không có ý tưởng làm thế nào để đi về phía trước.

+0

bạn có cố sử dụng lệnh PIVOT không? http://www.oracle.com/technetwork/articles/sql/11g-pivot-097235.html – tbone

+0

vâng, tôi đã cố gắng sử dụng trục xoay. Nhưng vấn đề là tôi nhận được 1,2,3,4,5 .... trong giá trị rn từ truy vấn của tôi, vì vậy tôi đang bị mắc kẹt ngay bây giờ mà làm thế nào tôi có thể sử dụng trục trong tình huống này – Jaanna

+0

ví dụ trục cung cấp – tbone

Trả lời

11

Đây là một cách để có được các dữ liệu trong các định dạng mà bạn muốn:

SELECT user_id, 
    max(case when lang = 'FI' THEN org ELSE ' ' END) org_fi, 
    max(case when lang = 'FI' THEN position ELSE ' ' END) position_fi, 
    max(case when lang = 'EN' THEN org ELSE ' ' END) org_en, 
    max(case when lang = 'EN' THEN position ELSE ' ' END) position_en, 
    max(case when lang = 'SV' THEN org ELSE ' ' END) org_sv, 
    max(case when lang = 'SV' THEN position ELSE ' ' END) position_sv 
FROM source 
group by user_id 
order by user_id 

Xem SQL Fiddle with Demo

+0

Cảm ơn, đã giúp tôi :-) – Jaanna

+0

Giải pháp tốt cho văn bản xoay vòng trong Oracle 10g. – Tykin

44

PIVOT nên hoạt động tốt - SQL Fiddle demo (schema mượn từ bluefeets answer)

SELECT * 
FROM source 
PIVOT (
     MIN(org) AS org, 
     MIN(position) AS position 
     FOR lang 
     IN('EN' AS en, 'FI' AS fi, 'SV' AS sv) 
    ); 
+7

+1 Tôi không biết rằng bạn có thể xoay quanh hai cột như thế. rất tốt đẹp – Taryn

+0

thanks..đây là khá hữu ích để tìm hiểu về xoay vòng hai cột. – Jaanna

+0

Cảm ơn bạn. Tôi đang tìm cái này :). –

4

11gr2 Ví dụ PIVOT

SQL> create table t1 
(
user_id number, 
org varchar2(10), 
position varchar2(10), 
lang varchar2(10) 
) 
Table created. 
SQL> insert into t1 values (1,'ABC','VVV','EN') 
1 row created. 
SQL> insert into t1 values (1,'DEF','WWW','FI') 
1 row created. 
SQL> insert into t1 values (2,'GHI','XXX','FI') 
1 row created. 
SQL> insert into t1 values (2,'JKL','YYY','SV') 
1 row created. 
SQL> insert into t1 values (3,'MNO','ZZZ','EN') 
1 row created. 
SQL> commit 
Commit complete. 
SQL> select * from t1 

    USER_ID ORG  POSITION LANG  
---------- ---------- ---------- ---------- 
     1 ABC  VVV  EN   
     1 DEF  WWW  FI  
     2 GHI  XXX  FI  
     2 JKL  YYY  SV  
     3 MNO  ZZZ  EN  

5 rows selected. 
SQL> select * from t1 
pivot(max(org) as org, max(position) as position for lang in ('EN' as "EN",'FI' as "FI",'SV' as "SV")) 

    USER_ID EN_ORG  EN_POSITION FI_ORG  FI_POSITION SV_ORG  SV_POSITION 
---------- ---------- ----------- ---------- ----------- ---------- ----------- 
     1 ABC  VVV   DEF  WWW        
     2      GHI  XXX   JKL  YYY  
     3 MNO  ZZZ              

3 rows selected. 
Các vấn đề liên quan