Sql 通过计算单元格数据将单行数据转换为多行数据

Sql 通过计算单元格数据将单行数据转换为多行数据,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,现在,我想要基于总计分割数据 例如,若我需要将数据除以20,那个么结果应该如下 create table #tmp (Name varchar(10), Code varchar(10), Date datetime, Total int) insert into #tmp select 'abc','A-8','2016-10-12',45 您可以看到上面的代码,您可以看到我将一行拆分为3行,除Total之外,所有数据都相同 总计应该以不同的方式计算,因为结果,我有3行。如果总计为65,则将

现在,我想要基于总计分割数据

例如,若我需要将数据除以20,那个么结果应该如下

create table #tmp (Name varchar(10), Code varchar(10), Date datetime, Total int)
insert into #tmp
select 'abc','A-8','2016-10-12',45
您可以看到上面的代码,您可以看到我将一行拆分为3行,除Total之外,所有数据都相同

总计应该以不同的方式计算,因为结果,我有3行。如果总计为65,则将有4行具有相同的数据,并且只有总计将被更改,如20、20、20、5,其余的将是相同的


我不想对WHILE等使用任何循环。

假设您有一个类似dbo.Nums的表

Name    Code    Date        Total
abc     A-8     2016-10-12  20
abc     A-8     2016-10-12  20
abc     A-8     2016-10-12  5 
或者,您也可以出于同样的目的使用下面的查询

SELECT *
FROM dbo.Nums

n
-----------
1
2
3
4
5
...
10000000
那么,问题就来了

SELECT ROW_NUMBER() OVER (ORDER BY object_id) FROM sys.all_objects
声明@d为INT=20;
选择#tmp.Name、Code、Date、@d作为总计
来自#tmp
交叉连接dbo.Nums

其中dbo.Nums.n您需要对其使用计数表。理货台应根据您的要求有记录,比如1到5或1到100。我已经创建了tmp理货表,但您可以为其创建实际理货表,如下所示:

DECLARE @d AS INT = 20;

SELECT #tmp.Name, Code, Date, @d AS Total
FROM #tmp
CROSS JOIN dbo.Nums
WHERE dbo.Nums.n <= (#tmp.Total / @d)
UNION ALL
SELECT #tmp.Name, Code, Date, (Total % @d) AS Total
FROM #tmp
WHERE (Total % @d) <> 0

感谢@Jarlh更正源代码。是否必须创建一个像dbo.Nums这样的表?这样的表使您的sql生活更轻松。您只需要生成一次。看看人们如何努力在飞行中保持平衡。
create table #tmp (Name varchar(10), Code varchar(10), Date datetime, Total int)
create table #tmp_tally (sno int)

insert into #tmp_tally
select 1
union all
select 2
union all
select 3
union all
select 4
union all
select 5

insert into #tmp
select 'abc','A-8','2016-10-12',45;

select #tmp.*, sno,case when ceiling(total/20) >= sno  then 20 else total % 20 end
from #tmp,#tmp_tally
where ceiling(total/20) >= sno- case when (total % 20) = 0 then 0 else 1 end