我有一個像下面的圖片Oracle視圖創建
。
在輸入表中,下名稱列的每個值應該有五個步驟A,B,C,d,E ....但名「VINOD」具有3個值A,B,C和它們的相應的日期28.12.2013,11.10.2013和NULL。所以,在視圖中,我應該爲每個名稱設置五個diffrenet列,如下所示。因爲「Vinod」沒有D和E,所以相應的日期應該是NA(但由於C值在表中是NULL,所以它只能被看作是NULL)。
希望我解釋了我的查詢。請幫助我。
在此先感謝。
我有一個像下面的圖片Oracle視圖創建
。
在輸入表中,下名稱列的每個值應該有五個步驟A,B,C,d,E ....但名「VINOD」具有3個值A,B,C和它們的相應的日期28.12.2013,11.10.2013和NULL。所以,在視圖中,我應該爲每個名稱設置五個diffrenet列,如下所示。因爲「Vinod」沒有D和E,所以相應的日期應該是NA(但由於C值在表中是NULL,所以它只能被看作是NULL)。
希望我解釋了我的查詢。請幫助我。
在此先感謝。
你可以嘗試:
SELECT name,
(CASE WHEN A_DATE IS NULL THEN 'NA' ELSE A_DATE END) as A_DATE,
(CASE WHEN B_DATE IS NULL THEN 'NA' ELSE B_DATE END) as B_DATE,
(CASE WHEN C_DATE IS NULL THEN 'NA' ELSE C_DATE END) as C_DATE,
(CASE WHEN D_DATE IS NULL THEN 'NA' ELSE D_DATE END) as D_DATE,
(CASE WHEN E_DATE IS NULL THEN 'NA' ELSE E_DATE END) as E_DATE
FROM (
SELECT name,
(SELECT date
FROM inputtable as i2
WHERE i2.name=i1.name
AND i2.step = 'A') as A_DATE,
(SELECT date
FROM inputtable as i3
WHERE i3.name=i1.name
AND i3.step = 'B') as B_DATE,
(SELECT date
FROM inputtable as i4
WHERE i4.name=i1.name
AND i4.step = 'C') as C_DATE,
(SELECT date
FROM inputtable as i5
WHERE i5.name=i1.name
AND i5.step = 'D') as D_DATE,
(SELECT date
FROM inputtable as i6
WHERE i6.name=i1.name
AND i6.step = 'E') as E_DATE
FROM inputtable as i1
GROUP BY name
) s1
您好,感謝一個lot..But,我們正在設置d和E日期'不適用' –
你說得對。我將在短時間內編輯它 –
你不應該混合數據類型那樣。 使用下面的測試案例:
-- drop table input_table;
create table input_table(
name varchar2(20) not null
,step varchar2(10) not null
,step_date varchar2(10)
);
insert into input_table(name, step, step_date) values('VINOD', 'A', '28.12.013');
insert into input_table(name, step, step_date) values('VINOD', 'B', '11.10.2013');
insert into input_table(name, step, step_date) values('VINOD', 'C', null);
commit;
以下(可怕的)查詢應該做你要求什麼:
select name
-- If a row exists (has flag) pick whatever value was there, otherwise set NA
,case when max(a_flag) = 'A' then max(a_date) else 'NA' end as a_date
,case when max(b_flag) = 'B' then max(b_date) else 'NA' end as b_date
,case when max(c_flag) = 'C' then max(c_date) else 'NA' end as c_date
,case when max(d_flag) = 'D' then max(d_date) else 'NA' end as d_date
,case when max(e_flag) = 'E' then max(e_date) else 'NA' end as e_date
from (select name
-- Pivot the dates to columns
,case when step = 'A' then step_date end as a_date
,case when step = 'B' then step_date end as b_date
,case when step = 'C' then step_date end as c_date
,case when step = 'D' then step_date end as d_date
,case when step = 'E' then step_date end as e_date
-- Create flags because we have two kinds of NULL...
,case when step = 'A' then 'A' end as a_flag
,case when step = 'B' then 'B' end as b_flag
,case when step = 'C' then 'C' end as c_flag
,case when step = 'D' then 'D' end as d_flag
,case when step = 'E' then 'E' end as e_flag
from input_table
)
group
by name;
您好,感謝您的輸入。我不能刪除表格,因爲它來自客戶端。總之,非常感謝這個想法! –
是你的家庭作業嗎? –
不...這是我工作的一部分。由於價值觀是公司的敏感,我giveing一個例子simiklar爲原始值 –
OKOK,它似乎我一個典型的DB問題,;-) –