簡體   English   中英

如何在旋轉數據時編寫 case 表達式

[英]How to write case expression while pivoting the data

CREATE TABLE details_1 (
    e_id    NUMBER(10),
    e_name  VARCHAR2(30),
    CONSTRAINT pk_details_1_e_id PRIMARY KEY ( e_id )
);

insert into details_1 values(11,'A');


CREATE TABLE ques_ans (
    ques_ans_id  NUMBER(10),
    ref_ques_id  NUMBER(10),
    ref_ans_id   NUMBER(10),
    ref_ans_value VARCHAR2(100),
    e_id         NUMBER(10),
    CONSTRAINT pk_ques_ans PRIMARY KEY ( ques_ans_id ),
    CONSTRAINT fk_ques_ans FOREIGN KEY ( e_id )
        REFERENCES details_1 ( e_id ),
        constraint fk_ques_and_ques_id foreign key(ref_ques_id)
        references ques_ref (ques_id)
);

insert into ques_ans values(1,3,1,11,null);
insert into ques_ans values(2,2,2,11,null);
insert into ques_ans values(3,4,1,11,null);
insert into ques_ans values(4,23,1,11,11);

CREATE TABLE ques_ref (
    ques_id     NUMBER(10),
    code        VARCHAR2(50),
    code_label  VARCHAR2(100),
    constraint pk_ques_ref primary key(ques_id)
);

insert into ques_ref values(3,'changes_exist','Any known changes');
insert into ques_ref values(2,'E_Clubbed','E_id clubbed with other');
insert into ques_ref values(4,'E_impacted','E impacted by other');
insert into ques_ref values(23,'E_Clubbed_with_other','E clubbed with other E');

CREATE TABLE ans_ref (
    ref_ans_id  NUMBER(10),
    code        VARCHAR2(10),
    code_value  VARCHAR2(30)
);

insert into ans_ref values(1,'R_Yes','Yes');
insert into ans_ref values(2,'R_No','No');

commit;

My Attempt :

select  d.e_id,
        max(case qa.ref_ques_id when 3 then ar.code_value end) changes_exist,
        max(case qa.ref_ques_id when 2 then ar.code_value end) E_Clubbed,
        max(case qa.ref_ques_id when 4 then ar.code_value end) E_impacted,
--need to write case expression here
  from      details_1 d
        join
            ques_ans qa
          on d.e_id = qa.e_id
        join ans_ref ar
          on ar.ref_ans_id = qa.ref_ans_id
  group by d.e_id

我陷入了以下要求:

我需要檢查ref_ques_id表的ques_ans是否為 23,那么它應該顯示來自同一個表的ref_ans_value ,即ques_ans

例如:在ques_ans_id 4 的表ques_ans中, ref_ques_id為 23,那么在這種情況下,它將在ref_ans_value列中顯示ref_ans_value即 11

如何在旋轉數據時編寫 case 表達式? 我想知道我們是否可以使用案例表達式來做到這一點,或者有沒有其他方法可以實現這一點?

預期 Output:

+------+---------------+-----------+------------+------------------+
| E_ID | CHANGES_EXIST | E_CLUBBED | E_IMPACTED | E_CLUBBED_WITH_E |
+------+---------------+-----------+------------+------------------+
|   11 | Yes           | No        | Yes        |               11 |
+------+---------------+-----------+------------+------------------+

您可以通過進一步的聚合來實現這一點。

CASE
    WHEN MAX(ques_ans.ref_ques_id) = '23' THEN MAX(COALESCE(ques_ans.ref_ans_value, 0))
    ELSE -4
END

您需要解決兩個問題:

1

您人為地匯總了SELECT子句中的內容以防止出現技術問題,但您可能需要更改此設置,具體取決於您的實際數據看起來如何(不是問題中顯示的數據,而是實際數據)。 如果您有不同參考的答案,那么您可能希望更改數據庫結構以更好地反映現實。

2

您沒有告訴我們當ques_id的值不是23 時會發生什么,所以我在ELSE中添加了一個臨時值。 您需要將其更改為您實際需要的那個。

在此處輸入圖像描述

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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