Tenho a seguinte tabela:
MyTable
PlaceID NameID Code CodeCount
1 1 1234A 2
1 2 1234A 3
1 3 1234A 1
2...
2...
3...
3...
Eu quero selecionar 1234A
onde PlaceID
= 1, o número de vezes igual à soma do CodeCount
. Então, o resultado seria seis linhas assim:
MyResult
Code
1234A
1234A
1234A
1234A
1234A
1234A
Eventualmente, essa seleção terá vários códigos diferentes para um único arquivo PlaceID
. SIM eu sei que estou duplicando dados, no final não vai ser muito e vou explicar porque estou fazendo isso abaixo.
Primeiro, eu precisava obter a soma das contagens:
DECLARE @cdcnt INT = (SELECT SUM(CodeCount) FROM MyTable WHERE PlaceID = 1 AND Code = '1234A')
Então eu posso usar esse valor como um controle em um loop while para selecionar o valor que muitas vezes:
DECLARE @i INT = 0;
WHILE @i < @cdcnt
BEGIN
SELECT DISTINCT Code
FROM MyTable
WHERE PlaceID = 1 AND Code = '1234A'
SET @i = @i + 1
END
O problema é que recebo 6 seleções separadas, em vez de uma seleção com 6 linhas. Como faço para criar MyResult
mostrado acima, em vez de 6 seleções separadas?
Por que estou fazendo isso: quero usar um gerador de números aleatórios para escolher um Code
com a frequência em que ele aparece agregado para cada um PlaceID
(haverá outros Codes
adicionados, ainda estou descobrindo como fazer apenas um). Estou aberto a sugestões de diferentes maneiras de fazer isso, mas é a única maneira de descobrir como. Se houver uma função já construída para escolher de uma lista de acordo com frequências definidas, sou todo ouvidos.
Abaixo está um exemplo usando uma junção a um CTE de registro. Seria melhor criar uma tabela de contagem/números materializada para facilitar esse tipo de tarefa daqui para frente e melhorar o desempenho também.