2016-04-21 65 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 directlynot held directly

+2

做一个UNION ALL,在第一个和第二选择oppsite选择RUnit和FDHUnit和无效。 – 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

尝试这个

插入到表:

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

正常结果: SELECT * FROM表1 UNION ALL 选择项目,日期,空, null,(Runit-fdhunit)from table1 where(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 
相关问题