Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

David Ramires

qual função usar

Recommended Posts

é o seguinte:

 

preciso contar quantas pessoas digitaram o nº 1,2,3,4 ect..

na tabela está assim o campo digito:

 

2-1-3-9-1-1-

3-9-2-1-3-1-6-6-6-6-6-6-6-6-6-6-6---6-6-

-

5-

tenho que fazer isso no sql server, ou dizendo tenho que montar uma proc, qual você sabe alguma função para tirar os - e contar quantos nº 1,2,3 tem em cada linha...

o resultado final fica mais ou menos assim:

 

serviços | quantidade

1 - servico x 8.355

2 - servico y 4.455

3 - servico z 124

4 - servico h 1.380

5 - servico s 533

 

Digito inválido 186

Não digitou após menu inicial 2.194

Não ouviu todo o menu inicial 1.942

preciso de dicas, o cara de banco de dados saiu fora, e fiquei com tudo na mão....

 

Obrigado

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara... que roubada hein ?!?Pra poder entender um pouco melhor o esquema... 1) Qual o tipo de dado e o tamanho da coluna que armazena estas informações ? 2) Sempre existe um traço ("-"), separando cada opção ? 3) É sempre um único dígito a ser identicado (0...9) ? Ou pode existir mais de um dígito (10, 11, 12, ... 100, 101, ...) 4) São muitos registros que você precisa aplicar este tratamento ? 5) O que é...

Digito inválido 186Não digitou após menu inicial 2.194Não ouviu todo o menu inicial 1.942

Compartilhar este post


Link para o post
Compartilhar em outros sites

David,

 

Como você não respondeu minhas perguntas, acabei assumindo algumas definições contidas na query abaixo.

 

O quê me ocorreu pra resolver este seu problema é : converter cada número contido entre os "-" de uma determinada coluna, em registros de uma tabela temporária. Depois é só agrupar a tabela pelo valor do campo e o resultado tá na mão !

 

O problema é que pra tratar string-por-string, só imagino fazer um cursor que varra a coluna byte-a-byte. Funciona... mas no caso de muitos registros o processo tende a ficar bem lento.

 

Bem... segue a query a qual você pode dar uma melhorada na sequencia.

 

Boa sorte !

 

set nocount on-- exemplo da tabela original   create table #tabela                         (     coluna varchar(50)   )   go   insert #tabela values ('0-1-2-3-4-5-6-7-12-8-9')   insert #tabela values ('0-2-370-4-6-8')   insert #tabela values ('2-2-4-16-4')   go -- tabela auxiliar que receberá os valores de uma determinada coluna como linha   create table #contador                       (    valor smallint   )   go-- cursor para converter os valores das colunas em linhas   declare cCursor cursor for    select coluna, len(coluna)    from #tabela   declare @Coluna  varchar(50)                              -- coluna com os dados a serem tratados   declare @TamCol  smallint                                 -- tamanho do conteúdo da coluna   declare @Posicao smallint                                 -- indica o próximo "-" dentro da string (tratado dentro do loop)   declare @Inicio  smallint                                 -- indica a posição de inicio do valor na string (tratado dentro do loop)   declare @Valor   varchar(3)                               -- valor separado na string (tratado dentro do loop)-- convertendo os valores das colunas para linhas (na tabela #contador)   open cCursor      fetch next from cCursor into @Coluna, @TamCol    while @@FETCH_STATUS = 0                                   -- loop para varrer todos os registros do cursor    begin     set @Posicao = 1     set @Inicio  = 1      -- print @Coluna     while @Posicao < @TamCol                                 -- loop para varrer byte a byte a coluna     begin        set @Posicao = CHARINDEX('-',@Coluna,@Posicao)        -- print SUBSTRING(@Coluna,@Inicio,@Posicao-@Inicio)        insert #contador values (convert(smallint,(SUBSTRING(@Coluna,@Inicio,@Posicao-@Inicio))))        set @Posicao  = @Posicao+1        set @Inicio = @Posicao     end     insert #contador values (SUBSTRING(@Coluna,@Inicio,@Posicao))        fetch next from cCursor into @Coluna, @TamCol   end      close cCursor   deallocate cCursor   go-- group na tabela #contador   select valor, count(valor) as qtde   from #contador   group by valor   go-- drop temps   drop table #tabela   drop table #contador   goset nocount off-- Versão inicial da query, precisa ser melhorada !-- Por exemplo : --   1) no tratamento de mais de um dígito no final da string--   2) cursor com milhares de registros tende a deixar o processo lento

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.