创建用于分隔各种线条的视图

时间:2015-12-14 18:41:55

标签: mysql sql sql-view

我有这张桌子:

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

如何将一行划分为几行?

2 个答案:

答案 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 日期表格代码