我有这张桌子:
-- Product --
id_product
date-begin
date_end
period
并填写:
id_project | date_begin | date_end | period
1 | 2015-01-01 | 2016-01-01 | 1 month
2 | 2015-12-01 | 2015-12-29 | 1 week
我希望View能够显示它:
id_project | date_payment
1 | 2015-02-01
1 | 2015-03-01
1 | 2015-04-01
...
1 | 2016-01-01
2 | 2015-12-01
2 | 2015-12-08
2 | 2015-12-15
2 | 2015-12-22
2 | 2015-12-29
如何将一行划分为几行?
答案 0 :(得分:1)
以下是解决问题的基本示例。
它首先要做的是为你创建一些数字视图,以便我们稍后加入。这些是一些笛卡尔联合创造大量的数字.. 16到100万..
CREATE OR REPLACE VIEW generator_16
AS SELECT 0 n UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL
SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL
SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL
SELECT 9 UNION ALL SELECT 10 UNION ALL SELECT 11 UNION ALL
SELECT 12 UNION ALL SELECT 13 UNION ALL SELECT 14 UNION ALL
SELECT 15;
CREATE OR REPLACE VIEW generator_256
AS SELECT ( ( hi.n << 4 ) | lo.n ) AS n
FROM generator_16 lo, generator_16 hi;
CREATE OR REPLACE VIEW generator_4k
AS SELECT ( ( hi.n << 8 ) | lo.n ) AS n
FROM generator_256 lo, generator_16 hi;
CREATE OR REPLACE VIEW generator_64k
AS SELECT ( ( hi.n << 8 ) | lo.n ) AS n
FROM generator_256 lo, generator_256 hi;
在这里找到代码.. Creating a "Numbers Table" in mysql
然后您可以使用此声明创建视图。
CREATE OR REPLACE VIEW product_payment_dates
AS SELECT p.id_project,
CASE
WHEN p.period LIKE '%month%' THEN DATE_ADD(p.date_begin,INTERVAL n.n MONTH)
WHEN p.period LIKE '%week%' THEN DATE_ADD(p.date_begin,INTERVAL n.n WEEK)
WHEN p.period LIKE '%day%' THEN DATE_ADD(p.date_begin,INTERVAL n.n DAY)
END as date_payment
FROM Product p
JOIN generator_64k n ON (CASE
WHEN p.period LIKE '%month%' THEN DATE_ADD(p.date_begin, INTERVAL n.n MONTH)
WHEN p.period LIKE '%week%' THEN DATE_ADD(p.date_begin, INTERVAL n.n WEEK)
WHEN p.period LIKE '%day%' THEN DATE_ADD(p.date_begin, INTERVAL n.n DAY)
END) <= p.date_end
ORDER BY p.id_project, date_payment;
这将查看确定是否应该在begin_date中添加月,周或天以构建列表的时间段。您还可以自定义此项以从期间中提取区间数,以防您想要添加2个月或3周等。
这是一切SQL Fiddle
答案 1 :(得分:0)
您需要的只是日期表,然后使用Inner Join
表格对dates
表进行操作
select *
from yourtable A
inner join Dates_table b
on b.dates between a.date_begin and a.date_end
如果您使用Sql Server
,请检查此link 日期表格代码