簡體   English   中英

如何將這3個條目“透視”成一行? (由相同的組合鍵捆​​綁在一起)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM