2016-04-21 2 views
0

Я уже давно застрял в этом вопросе и добился нулевого прогресса. Я даже не знаю, если это возможно ...Как дублировать записи в одной таблице

У меня есть 1 стол:

+------+------------+-------+---------+------------+ 
| Item | Date | RUnit | FDHUnit | Difference | 
+------+------------+-------+---------+------------+ 
| A | 19/04/2016 | 21000 | 20000 |  1000 | 
| B | 20/04/2016 | 2500 |  500 |  2000 | 
+------+------------+-------+---------+------------+ 

Можно ли создать новую строку в той же таблице для каждого из этих items который будет отображать Difference и, возможно, несколько других столбцов?

Мой желаемый результат будет что-то вроде этого:

+------+------------+-------+---------+------------+ 
| Item | Date | RUnit | FDHUnit | Difference | 
+------+------------+-------+---------+------------+ 
| A | 19/04/2016 | 21000 | 20000 |   | 
| A | 19/04/2016 | NULL | NULL |  1000 | 
| B | 20/04/2016 | 2500 | 500  |   | 
| B | 20/04/2016 | NULL | NULL |  2000 | 
+------+------------+-------+---------+------------+ 

Причина в том, что я хотел бы показать новый столбец и указать, что это либо Held directly или not held directly.

+2

Выполните UNION ALL, выберите RUnit и FDHUnit и нуль в первом, и oppsite во втором выберите. – jarlh

ответ

0

Да, используйте union all:

select item, date, ruunit, fdhunit, difference 
from t 
union all 
select item, date, null, null, runit - fdhunit 
from t 
order by item, (case when runit is not null then 1 else 2 end); 

order by помещает результаты в порядке, что ваши результаты свидетельствуют о том. Без order by упорядочение записей является неопределенным.

+0

Yikes - Я даже не подумал, что это будет так просто, как «union». Здесь я пытался присоединиться к нему сам или использовать «CTE». Иногда это самая простая вещь. Спасибо чувак. – Mike

0

попробовать этот путь

select * from 
(select item, date, ruunit, fdhunit, '' as difference 
from t 
union all 
select item, date, null as ruunit, null as fdhunit, difference 
from t) a 
order by item, date 
0

Try This

Вставка в таблицу:

insert into table1 
select item,date,null,null,(Runit-fdhunit) from table1 where (Runit-fdhunit) 

Нормальный результат: выберите * от table1 союза все выберите пункт, дата, нулевой null (Runit-fdhunit) из таблицы 1 где (Runit-fdhunit) <> 0

0

Попробуйте это. Заменить cast(null as number) с фактическим типом difference колонок

select item, date, r.ruunit, r.fdhunit, r.difference 
from t 
cross apply ( 
    select n=1, ruunit, fdhunit, cast(null as number) difference 
    UNION 
    select n=2, null, null, difference) r 
order by item, date, n 
Смежные вопросы