0

我有一个数据集,其中包含客户可以获得的服务类型的每月预算。SERVICES_ID是服务的类型,Begin_DTEnd_DT给出 了服务适用的时间范围, COST_PER_MONTH 给出了每月预算的金额, NUMBER_OF_MONTHS给出了该服务的预算适用的月数。

这是一个示例数据集,您会注意到有两个客户,每个客户都有两个服务预算。一位客户同时享受两项服务 12 个月,另一位客户一项服务 12 个月,另一位客户服务 6 个月。

CREATE TABLE Services (
    ID int,
    SERVICES_ID int,
    Begin_DT datetime, 
    End_DT datetime, 
    COST_PER_MONTH  int, 
    NUMBER_OF_MONTHS int)

('10178',   9,  '7/21/2011',    '7/21/2012' 203.2,  12)
('10178',   10, '7/21/2011',    '7/21/2012' 78.2,   12)
('13862',   12, '12/8/2011',    '6/3/2012', 469.2,  6)
('13862',   10,  '6/3/2011',    '6/3/2012',  78.2,  12)

我需要有一个查询,它添加一个Month和一个Year变量,并为每个月添加行,服务预算在Begin_DTEnd_DT之间的月份范围内。这就是我要找的:

CREATE TABLE Services_monthly (
    ID int,
    SERVICES_ID int,
    Begin_DT datetime, 
    End_DT datetime, 
    Month int,
    Year int,
    COST_PER_MONTH  int, 
    NUMBER_OF_MONTHS int)

('10178',   9,  '7/21/2011',    '7/21/2012',    7,  2011,   203.2,  12),
('10178',   9,  '7/21/2011',    '7/21/2012',    8,  2011,   203.2,  12),
('10178',   9,  '7/21/2011',    '7/21/2012',    9,  2011,   203.2,  12),
('10178',   9,  '7/21/2011',    '7/21/2012',    10, 2011,   203.2,  12),
('10178',   9,  '7/21/2011',    '7/21/2012',    11, 2011,   203.2,  12),
('10178',   9,  '7/21/2011',    '7/21/2012',    12, 2011,   203.2,  12),
('10178',   9,  '7/21/2011',    '7/21/2012',    1,  2012,   203.2,  12),
('10178',   9,  '7/21/2011',    '7/21/2012',    2,  2012,   203.2,  12),
('10178',   9,  '7/21/2011',    '7/21/2012',    3,  2012,   203.2,  12),
('10178',   9,  '7/21/2011',    '7/21/2012',    4,  2012,   203.2,  12),
('10178',   9,  '7/21/2011',    '7/21/2012',    5,  2012,   203.2,  12),
('10178',   9,  '7/21/2011',    '7/21/2012',    6,  2012,   203.2,  12),
('10178',   9,  '7/21/2011',    '7/21/2012',    7,  2012,   203.2,  12),
('10178',   10, '7/21/2011',    '7/21/2012',    7,  2011,   78.2,   12),
('10178',   10, '7/21/2011',    '7/21/2012',    8,  2011,   78.2,   12),
('10178',   10, '7/21/2011',    '7/21/2012',    9,  2011,   78.2,   12),
('10178',   10, '7/21/2011',    '7/21/2012',    10, 2011,   78.2,   12),
('10178',   10, '7/21/2011',    '7/21/2012',    11, 2011,   78.2,   12),
('10178',   10, '7/21/2011',    '7/21/2012',    12, 2011,   78.2,   12),
('10178',   10, '7/21/2011',    '7/21/2012',    1,  2012,   78.2,   12),
('10178',   10, '7/21/2011',    '7/21/2012',    2,  2012,   78.2,   12),
('10178',   10, '7/21/2011',    '7/21/2012',    3,  2012,   78.2,   12),
('10178',   10, '7/21/2011',    '7/21/2012',    4,  2012,   78.2,   12),
('10178',   10, '7/21/2011',    '7/21/2012',    5,  2012,   78.2,   12),
('10178',   10, '7/21/2011',    '7/21/2012',    6,  2012,   78.2,   12),
('10178',   10, '7/21/2011',    '7/21/2012',    7,  2012,   78.2,   12),
('13862',   12, '12/8/2011',    '6/3/2012',     12, 2011,   469.2,  6),
('13862',   12, '12/8/2011',    '6/3/2012',     1,  2012,   469.2,  6),
('13862',   12, '12/8/2011',    '6/3/2012',     2,  2012,   469.2,  6),
('13862',   12, '12/8/2011',    '6/3/2012',     3,  2012,   469.2,  6),
('13862',   12, '12/8/2011',    '6/3/2012',     4,  2012,   469.2,  6),
('13862',   12, '12/8/2011',    '6/3/2012',     5,  2012,   469.2,  6),
('13862',   12, '12/8/2011',    '6/3/2012',     6,  2012,   469.2,  6),
('13862',   10, '6/3/2011',     '6/3/2012',     6,  2011,   78.2,   12),
('13862',   10, '6/3/2011',     '6/3/2012',     7,  2011,   78.2,   12),
('13862',   10, '6/3/2011',     '6/3/2012',     8,  2011,   78.2,   12),
('13862',   10, '6/3/2011',     '6/3/2012',     9,  2011,   78.2,   12),
('13862',   10, '6/3/2011',     '6/3/2012',     10, 2011,   78.2,   12),
('13862',   10, '6/3/2011',     '6/3/2012',     11, 2011,   78.2,   12),
('13862',   10, '6/3/2011',     '6/3/2012',     12, 2011,   78.2,   12),
('13862',   10, '6/3/2011',     '6/3/2012',      1, 2012,   78.2,   12),
('13862',   10, '6/3/2011',     '6/3/2012',      2, 2012,   78.2,   12),
('13862',   10, '6/3/2011',     '6/3/2012',      3, 2012,   78.2,   12),
('13862',   10, '6/3/2011',     '6/3/2012',      4, 2012,   78.2,   12),
('13862',   10, '6/3/2011',     '6/3/2012',      5, 2012,   78.2,   12)
4

2 回答 2

1

询问:

SQLFIDDLE示例

SELECT  ID, 
        SERVICES_ID,
        Begin_DT, 
        End_DT,
        MONTH(DATEADD(MONTH,n.number, Begin_DT)) AS Month,
        YEAR(DATEADD(MONTH,n.number, Begin_DT)) AS Year,
        COST_PER_MONTH , 
        NUMBER_OF_MONTHS
FROM   Services  s,
(SELECT DISTINCT number 
 FROM master..spt_values 
 WHERE number >= 0 
 AND number < 100)  n
WHERE  n.number <= s.NUMBER_OF_MONTHS

您的结果错误,您需要将最后一行添加到您的数据中:

| 13862 |          10 |     June, 03 2011 00:00:00+0000 | June, 03 2012 00:00:00+0000 |     6 | 2012 |           78.2 |               12 |

我认为我的小提琴像你想要的那样工作。

于 2013-08-27T21:18:52.297 回答
0

请试试这个:

with number_cte (number) as
(select distinct number from master..spt_values where number between 1 and 1000) 

Select  ID, SERVICES_ID,Begin_DT, End_DT,COST_PER_MONTH , NUMBER_OF_MONTHS
from   Services_monthly  s cross join number_cte n
where  n.number <= s.NUMBER_OF_MONTHS

此外,最好的解决方案是创建一个表变量并用数字填充它。

于 2013-08-27T20:03:52.837 回答