2014-02-18 2 views
0

У меня есть случай, как показано на картинке внизуOracle вид создания

enter image description here.

В таблице ввода каждое значение под столбцом имени должно иметь пять шагов A, B, C, D, E .... Но имя «VINOD» имеет 3 значения A, B, C и их соответствующие даты: 28.12.2013,11.10.2013 и NULL. Итак, в представлении у меня должно быть пять столбцов diffenet для каждого имени, как показано ниже. Так как «Vinod» не имеет D и E, соответствующие даты должны быть Seens NA (но поскольку значение C равно NULL в таблице, его следует рассматривать только как NULL).

Надеюсь, я объяснил свой запрос. Пожалуйста, помогите мне.

Заранее спасибо.

+0

ли ваши домашние? –

+0

нет ... это часть моей работы. Поскольку значения чувствительны к компании, я привел пример simiklar к исходным значениям –

+0

okok, это показалось моей типичной проблеме с БД; ;-) –

ответ

0

Вы можете попробовать:

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 
+0

Привет, спасибо много. Но где мы устанавливаем даты D и E для 'NA' здесь –

+0

Вы правы. Я собираюсь отредактировать его в один момент –

0

Не следует смешивать типы данных, как это. Используя следующий тестовый случай:

-- 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; 
+0

Привет, Спасибо за ввод. Я не могу отказаться от таблиц, поскольку он поступает со стороны клиента. Во всяком случае, большое спасибо за идею !!!! –

Смежные вопросы