我看到了@ypercubeᵀᴹ 的回答,它给出了一个很好的答案,说明如何计算看似按 3 排序的数量并给出整数答案。这让我想到,如果拆分次数可变,您将如何处理这种情况?
这意味着这是你总是被 3 分割的 OP(原始海报
Create Table #Orders
(
id int IDENTITY(1,1) PRIMARY KEY NOT NULL
,partid varchar(100) NOT NULL
,qtyordered int DEFAULT '0'
,orderedby varchar(100) NOT NULL
,ordereddate date DEFAULT GETDATE()
) ;
Insert Into #Orders (partid, qtyordered, orderedby) VALUES
('SS100', 10, 'James'), ('RR200', 5, 'Bob'), ('NN300', 3, 'Jake'), ('OO400', 5, 'Blue') ;
SELECT
partid,
qtyordered,
[First],
[Second],
[Third]
FROM
#Orders
CROSS APPLY
( SELECT [Third] = (qtyordered) / 3 ) AS q3
CROSS APPLY
( SELECT [Second] = (qtyordered - [Third]) / 2 ) AS q2
CROSS APPLY
( SELECT [First] = (qtyordered - [Third] - [Second]) / 1 ) AS q1;
dbfiddle在这里
但是,如果不是总是按 3 拆分,而是有一个 int 变量来说明要拆分多少次,比如相同的 DDL,但不是按 3 拆分,你会使用
Declare @TTS int = 5
现在你将每个场景分成 5 种方式而不是 3 种方式。基本上是一个可重用的函数,可以根据变量“即时”拆分?
基本上,我们只是希望将除法的余数分散到值上。这个过程正是这样做的;它将返回一个表,其中包含拆分的结果值。我假设我们不想返回可变数量的列(取决于我们收到的除数),我决定实际生成文本“First”、“Second”等并不是问题的一部分,所以我在自己的行中返回每个值。
以下:
产生这些结果:
或者,您可以将其设为内联表值函数:
因此,您运行与上述相同的查询:
结果是一样的。回答一个评论:这将允许你拉
result_val
入一个变量:编辑:更改函数名称,因此函数和过程可以共存(如果您出于某种原因希望它们共存)。
更新
我使用递归函数来计算每个 int 项,并使用动态查询来转换结果。
现在是动态 PIVOT:
这是最终结果:
dbfiddle在这里
这是我的第一个答案,它使用一个函数来构建一个包含所有 int 项的逗号分隔字符串。
dbfiddle在这里