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