Eu vi uma resposta de @ypercubeᵀᴹ que deu uma ótima resposta sobre como calcular o que parecia ser uma quantidade ordenada por 3 e dar respostas de números inteiros. O que me fez pensar, como você lidaria com uma situação se houvesse um número variável de vezes para dividir?
Significando que este era o OP onde você sempre dividiria por 3 ( Pôster Original
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 aqui
No entanto, e se, em vez de sempre dividir por 3, você tivesse uma variável int que indicasse quantas vezes dividir, digamos o mesmo DDL, mas em vez de dividir por 3 você usa
Declare @TTS int = 5
E agora você divide cada cenário de 5 maneiras em vez de 3. Basicamente uma função reutilizável que pode dividir "on-the-fly" com base em uma variável?
Basicamente, estamos apenas procurando distribuir o resto da divisão pelos valores. Este procedimento faz exatamente isso; ele retornará uma tabela com os vals de resultado da divisão. Suponho que não queremos retornar um número variável de colunas (dependendo dos divisores que recebemos), e decidi que gerar o texto "Primeiro", "Segundo" etc. então estou retornando cada valor em sua própria linha.
A seguir:
Gera estes resultados:
Como alternativa, você pode tornar isso uma função com valor de tabela inline:
Você executa as mesmas consultas acima assim:
Os resultados são os mesmos. Para responder a um comentário: isso permitiria que você puxesse
result_val
uma variável:EDIT: Nome da função alterado, para que função e procedimento possam coexistir (se você quiser, por algum motivo).
ATUALIZAR
Eu usei uma função recursiva para calcular cada item int e uma consulta dinâmica para dinamizar o resultado.
E agora o PIVOT dinâmico:
E este é o resultado final:
dbfiddle aqui
Esta é minha primeira resposta, ele usa uma função para construir uma string delimitada por vírgula com todos os itens int.
dbfiddleaqui