如何在db2中将单行拆分为多行?

时间:2014-11-25 18:22:55

标签: sql db2

这就是我在表xyz中所拥有的

NAME      AMOUNT      BEGIN_DATE        END_DATE

ABC       5.0        2013-05-11         2014-06-20

以下是我想要使用的IBM DB2数据库

NAME      AMOUNT      BEGIN_DATE        END_DATE

ABC        5.0        2013-05-11         2013-12-31

ABC        5.0        2014-01-01         2014-06-30

而不是xyz表中的一行,我需要获取2行作为上面的输出。 如何将一行拆分为两行?

2 个答案:

答案 0 :(得分:1)

以下内容仅列出开始日期和结束日期恰好跨越两年或同一年的行。

SELECT 
    NAME,
    AMOUNT,
    BEGIN_DATE,
    DATE(YEAR(BEGIN_DATE)||'-12-31') AS END_DATE
 FROM xyz
 WHERE YEAR(END_DATE)-YEAR(BEGIN_DATE)=1
UNION
SELECT 
    NAME,
    AMOUNT,
    DATE(YEAR(END_DATE)||'-01-01') AS BEGIN_DATE,
    END_DATE
 FROM xyz
 WHERE YEAR(END_DATE)-YEAR(BEGIN_DATE)=1
UNION
SELECT 
    NAME,
    AMOUNT,
    BEGIN_DATE,
    END_DATE
 FROM xyz
 WHERE YEAR(END_DATE)-YEAR(BEGIN_DATE)=0
ORDER BY BEGIN_DATE

答案 1 :(得分:0)

你可以制作两个SQL语句,选择第一个,使用'2013-12-31'作为结束日期的常量,然后选择第二次,使用'2014-01-01'作为常量开始日期。然后使用UNION ALL将它们放在一起。

如果您还有一些在2013年内开始和结束的记录,因此不需要拆分,您可以单独获取这些记录,并将其从其他两个查询中排除。您的数据中的其他变体可能需要一些额外的条件,但是这个例子可以帮助您:

select NAME, AMOUNT, BEGIN_DATE, END_DATE
from xyz
where END_DATE <= '2013-12-31'
UNION ALL
select NAME, AMOUNT, BEGIN_DATE, '2013-12-31'
from xyz
where END_DATE >= '2014-01-01'
UNION ALL
select NAME, AMOUNT, '2014-01-01', END_DATE 
from xyz
where END_DATE >= '2014-01-01'