[英]How to 'pivot' these 3 entries into a single row? ( tied together by the same composite key)
所以我有以下示例數據(3個表)
我有一個名為CASE的“主”驅動程序表
CASE_ID CASE_NAME CASE_DATE
1 Test1 01-JAN-18
2 Test2 02-JAN-18
3 Test1 p2 03-JAN-18
4 Test2 p2 03-JAN-18
我有一個名為CASE_VAL_REL的rel_table
CASE_VAL_ID CASE_ID VAL_ID CASE_VAL_TYPE
1 1 1 Weight
2 3 2 Height
3 3 3 Age
4 2 4 Weight
5 4 5 Height
6 4 6 Age
最后,我有一個表需要與名為VAL的REL表聯接
VAL_ID VAL TIMESTAMP PERSON_NAME GENDER
1 150 06-FEB-19 Matt Male
2 62 06-FEB-19 Matt Male
3 25 06-FEB-19 Matt Male
4 100 06-FEB-19 Pauline Female
5 70 06-FEB-19 Pauline Female
6 22 06-FEB-19 Pauline Female
我需要一個如下所示的結果集/表(case_id不能將其連接,因為它們打開了兩個單獨的案例來導出所需的信息。相反,我們可能需要結合某種“復合鍵”。是我想要的結果集:
PERSON_NAME GENDER AGE WEIGHT HEIGHT
Matt Male 25 150 62
Pauline Female 22 100 70
下面是我的嘗試,但效果並不理想(至少對於較大的數據集而言)
SELECT MAX(CASE WHEN CASE_VAL_TYPE = 'Weight'
THEN VAL
END) as Weight
, MAX(CASE WHEN CASE_VAL_TYPE = 'Height'
THEN VAL
END) as Height
, MAX(CASE WHEN CASE_VAL_TYPE = 'Age'
THEN VAL
END) as Age
, PERSON_NAME
, GENDER
FROM CASE C
JOIN CASE_VAL_REL CVR on C.CASE_ID = CVR.CASE_ID
JOIN VAL V on CVR.VAL_ID = V.VAL_ID
GROUP BY PERSON_NAME, GENDER;
提前致謝。
我建議您更改表鬃毛的情況,以免與sintax和起始形式VAL對情況使用左連接的情況發生沖突
SELECT MAX(CASE WHEN CVR.CASE_VAL_TYPE = 'Weight'
THEN V.VAL
END) as Weight
, MAX(CASE WHEN CVR.CASE_VAL_TYPE = 'Height'
THEN V.VAL
END) as Height
, MAX(CASE WHEN CVR.CASE_VAL_TYPE = 'Age'
THEN V.VAL
END) as Age
, V.PERSON_NAME
, V.GENDER
FROM VAL V
INNER JOIN CASE_VAL_REL CVR on CVR.VAL_ID = V.VAL_ID
LEFT JOIN CASES C on C.CASE_ID = CVR.CASE_ID
GROUP BY PERSON_NAME, GENDER;
我只是將VAL_ID作為序列號,並將VAL按重量,高度和年齡排序,不確定我的解釋從最終表VAL得出預期結果的正確性只是避免避免聯接其他表。
create table VAL
(VAL_ID NUMBER,
VAL NUMBER,
TIMESTAMP DATE,
PERSON_NAME varchar2(20),
GENDER varchar2(10));
insert into VAL values(1,150,'06-FEB-19','Matt','Male');
insert into VAL values(2,62,'06-FEB-19','Matt','Male');
insert into VAL values(3,25,'06-FEB-19','Matt','Male');
insert into VAL values(4,100,'06-FEB-19','Pauline','Female');
insert into VAL values(5,70,'06-FEB-19','Pauline','Female');
insert into VAL values(6,22,'06-FEB-19','Pauline','Female');
select PERSON_NAME,GENDER,
max(case when mod(VAL_ID,3)=1 then VAL end) "WEIGHT",
max(case when mod(VAL_ID,3)=2 then VAL end) "HEIGHT",
max(case when mod(VAL_ID,3)=0 then VAL end) "AGE"
from VAL
group by PERSON_NAME,GENDER;
我重命名了表t1,t2和t3。 查看數據后,我從解決方案中刪除了t1,因為您似乎希望每人一行,因此所有目標數據都位於t2和t3中。 我選擇了名稱,性別和SUM(當case_val_type ='X'時返回val否則為0),其中X分別是FROM(用人作為(從t3中選擇不同的person_name)選擇select people.person_name,t3.gender,t2。 case_val_type,來自人員的t3.val在t3上加入t3。person_name= people.person_name在t2.val_id = t3.val_id上加入t2)iq由iq.person_name,iq.gender分組,結果是您的兩行目標。 -請原諒我未格式化,但尚未找到格式化說明。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.