当列值按日期大于1时,基于SQL拆分行

当列值按日期大于1时,基于SQL拆分行,sql,sql-server,database,Sql,Sql Server,Database,我有一个表,我需要根据一个日期列和另一个值列拆分列 基本上,当数字列大于1时,我需要在同一日期拆分该列,直到该列等于1为止 例如,这是传入的数据集 +----------------------------------------------+ | CONF# DATE Numbers Rev | +----------------------------------------------+ | ------- ----------- -------

我有一个表,我需要根据一个日期列和另一个值列拆分列

基本上,当数字列大于1时,我需要在同一日期拆分该列,直到该列等于1为止

例如,这是传入的数据集

+----------------------------------------------+
|     CONF#   DATE       Numbers     Rev       |
+----------------------------------------------+
| ------- ----------- ----------- -----------  |
| 24720   01/10/2014  1           35           |
| 24437   11/09/2014  2           450          |
| 24007   04/08/2014  3           15           |
| 24628   25/09/2014  1           100          |
+----------------------------------------------+
我正在寻找的结果

+----------------------------------------------+
|     CONF#   DATE        Numbers     Rev      |
+----------------------------------------------+
| ------- ----------- ----------- -----------  |
| 24720   01/10/2014  1           35           |
| 24437   11/09/2014  1           225          |
| 24437   11/10/2014  1           225          |
| 24007   04/08/2014  1           5            |
| 24007   04/09/2014  1           5            |
| 24007   04/10/2014  1           5            |
| 24628   25/09/2014  1           100          |
+----------------------------------------------+
返回结果集时,这些行大于一个已拆分的行。 rev在被拆分的行中平均分配

我正试着为这个写一个游标

    DECLARE cursor_SplitRow CURSOR
FOR SELECT 
      [Conf#]
FROM [table];

OPEN cursor_SplitRow;
FETCH NEXT FROM cursor_SplitRow INTO 
@Conf#;
WHILE @@FETCH_STATUS = 0
BEGIN
    DECLARE @counter INT = 1;
    WHILE @counter <= @Numbers
        BEGIN
            INSERT INTO #TemptTable
            VALUES(@CONF#  ,
                   @DATE,
                   1,
                   @Rev/@numbers

我认为代码需要运行以除以它过去1的数量,因此如果数字是5,则收入必须除以5并平均分割,这就是我被卡住的地方。不要使用光标。使用递归CTE:

with cte as (
      select conf#, date, numbers, rev / numbers as rev, 1 as n
      from t
      union all
      select conf#, dateadd(day, 1, date), numbers, rev, n + 1
      from cte
      where n < numbers
     )
select conf#, date, 1 as n, rev
from cte;
如果您手边有数字或理货台,您也可以使用:

with n as (
      select row_number() over (order by (select null)) as n
      from master..spt_values
     )
select t.conf#, dateadd(day, 1, t.date), 1 as number, t.rev / t.numbers
from t join
     n
     on n <= t.numbers;

您还可以使用特别的理货/数字表

范例


@康诺梅克。这很容易合并到查询中。我删除了最后一条评论,我想说谢谢。结果显示行是正确的。现在唯一的事情是大于1的数字相加,而不是1。实际上我从这里得到了它,再次感谢你,非常感谢
Select [Conf#]
      ,[Date]
      ,[Numbers] = 1
      ,[Rev] = Rev/A.Numbers
 From YourTable A
 Join ( 
        Select Top 1000 N=Row_Number() Over (Order By (Select NULL)) From master..spt_values n1, master..spt_values n2
      ) B on B.N<=A.Numbers
 Order By CONF# Desc
Conf#   Date        Numbers Rev
24720   01/10/2014  1       35.00
24628   25/09/2014  1       100.00
24437   11/09/2014  1       225.00
24437   11/09/2014  1       225.00
24007   04/08/2014  1       5.00
24007   04/08/2014  1       5.00
24007   04/08/2014  1       5.00