Sql server 如何在Sql Server中将数字字段拆分为较小的段
我在SQL Server中有一个带有两个字段的表Sql server 如何在Sql Server中将数字字段拆分为较小的段,sql-server,split,group-by,tile,Sql Server,Split,Group By,Tile,我在SQL Server中有一个带有两个字段的表 Total Group 35645 24 12400 55 30000 41 我想把每组分成固定大小的7000个较小的段,每组的其余部分分成最后一个段。因此,输出应该如下所示 Segment Total Group 1 7000 24 2 7000 24 3 7000 24 4 7000 24
Total Group
35645 24
12400 55
30000 41
我想把每组分成固定大小的7000个较小的段,每组的其余部分分成最后一个段。因此,输出应该如下所示
Segment Total Group
1 7000 24
2 7000 24
3 7000 24
4 7000 24
5 7000 24
6 645 24
1 7000 55
2 5400 55
1 7000 41
2 7000 41
3 7000 41
4 7000 41
5 2000 41
这应该做到:
declare @t table (Total int,[Group] int)
insert into @t(Total,[Group]) values
(35645,24 ),
(12400,55 ),
(30000,41 )
;With Numbers as (
select ROW_NUMBER() OVER (ORDER BY number)-1 n
from master..spt_values
)
select
n.n+1 as Segment,
CASE WHEN (n.n+1)*7000 < t.Total THEN 7000
ELSE t.Total - (n.n*7000) END as Total,
t.[Group]
from
@t t inner join
Numbers n on n.n*7000 < t.Total
我使用和函数准备了下面的SELECT语句
你比我快,我刚做完,看到了你的答案。好的一个快速搜索此表(
master..spt_values
)显示了许多不建议使用此表的链接,因为它是一个遗留的、未记录的表。因此,我并不是说你的答案是错误的,但也许创建自己的表来分割值会更好,因为你永远不知道这个表什么时候会被弃用。(只有我的2美分)。不管怎样,我很高兴能提出一些关于SQL的新东西Server@Radu我同意。使用一个有10个值的cte和一对交叉联接将生成一个具有零读取的良好计数表。然而,对于像这个一样可靠的答案来说,这有点挑剔。@SeanLange没有说这不是一个可靠的答案,也没有说那一点。尤其是CTE
后面的部分,纯粹是优雅的。我只是想引起大家对其他观点的注意。@RaduGheorghiu-但请注意,我正在小心不要使用该表中的值。我只是把它当作一张有很多行的桌子。我将添加一个注释来说明这一点
Segment Total Group
-------------------- -------------------- -----------
1 7000 24
2 7000 24
3 7000 24
4 7000 24
5 7000 24
6 645 24
1 7000 55
2 5400 55
1 7000 41
2 7000 41
3 7000 41
4 7000 41
5 2000 41
declare @divisor int = 7000
;with CTE as (
select
Total,
[Group],
@divisor divisor,
(Total / @divisor) quotient,
(Total % @divisor) reminder
from t
), NT as (
SELECT i FROM dbo.NumbersTable(1, (select max(quotient) from CTE) ,1)
)
select
case when i = 0 then reminder else divisor end as Total,
[Group]
from (
select *
from CTE, NT
where quotient >= i
union all
select *, 0 as i
from CTE
where reminder >= 0
) t
order by [Group], i desc