[SQL] 두 개의 열을 사용하여 데이터의 피벗
SQL두 개의 열을 사용하여 데이터의 피벗
나는 피봇 형식의 데이터가 있습니다. 그것은 다음과 같습니다 :
-----------------------------------------
| 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 |
-----------------------------------------
나는 데이터로 표현하고 싶습니다 :
-------------------------------------------------------------------------------------
| 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 |
-------------------------------------------------------------------------------------
나는 명령에 의해 연결이있는 피벗 쿼리가 필요하다고 생각합니다.
이것은 내가하려고 것입니다 :
SELECT user_id,
org,
position,
lang,
ROW_NUMBER () OVER (PARTITION BY lang, user_id ORDER BY ROWID) rn
FROM source
그러나, 나는 앞으로 이동하는 방법을 모른다.
해결법
-
==============================
1.여기에 원하는 형식의 데이터를 얻을 수있는 방법은 다음과 같습니다
여기에 원하는 형식의 데이터를 얻을 수있는 방법은 다음과 같습니다
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
데모와 SQL 바이올린을 참조하십시오
-
==============================
2.PIVOT 잘 작동합니다 - SQL 바이올린 데모 (bluefeets 응답에서 차용 스키마)
PIVOT 잘 작동합니다 - SQL 바이올린 데모 (bluefeets 응답에서 차용 스키마)
SELECT * FROM source PIVOT ( MIN(org) AS org, MIN(position) AS position FOR lang IN('EN' AS en, 'FI' AS fi, 'SV' AS sv) );
-
==============================
3.11gr2 PIVOT 예
11gr2 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.
from https://stackoverflow.com/questions/11987067/pivoting-of-data-using-two-columns by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] SQL Server 2005의 계층 적 쿼리 (0) | 2020.05.03 |
---|---|
[SQL] PBKDF2의 SQL 구현이 있습니까? (0) | 2020.05.03 |
[SQL] SQL 서버의 순열을 생성하는 가장 우아한 방법 (0) | 2020.05.03 |
[SQL] 어떻게 CASE 표현식은 ELSE 절에 도달 하는가? (0) | 2020.05.03 |
[SQL] 어떻게 여러 테이블에 데이터 집합을 채우기 위해? (0) | 2020.05.03 |