Ir para conteúdo
Fórum Script Brasil
  • 0

agrupamento


Pedro Gaz

Pergunta

Estou com a seguinte dificuldade:

tenho uma tabela do seguinte modo:

estaca lote

1 lote1

2 lote1

3 lote1

4 lote2

5 lote2

6 lote2

7 lote3

8 lote1

9 lote1

10 lote1

11 lote1

.. ..

.. ..

preciso fazer um sql que me retorne o seguinte resultado

lote1 1 ate 3

lote2 4 ate 6

lote3 7

lote1 9 ate 10

Não sei se fui claro, mas é algo desse tipo que preciso..

Link para o comentário
Compartilhar em outros sites

5 respostass a esta questão

Posts Recomendados

  • 0

Boa tarde Pedro,

Parece que houve um erro na hora da digitação no exemplo. No começo, o lote1 vai de 1 até 3. Depois o lote1 repete de 8 até 11. No resultado, os números iniciais de Estacas não estão de acordo com os lotes... :.)

Fiz um exemplo logo abaixo utilizando os dados do seu exemplo. Faça os testes e olhe se é isso mesmo que precisa.

Qualquer coisa, pode postar...

create table #Lotes (Estaca int, Lote varchar(10))

insert into #Lotes values (1 ,'lote1')
insert into #Lotes values (2 ,'lote1')
insert into #Lotes values (3 ,'lote1')
insert into #Lotes values (4 ,'lote2')
insert into #Lotes values (5 ,'lote2')
insert into #Lotes values (6 ,'lote2')
insert into #Lotes values (7 ,'lote3')
insert into #Lotes values (8 ,'lote1')
insert into #Lotes values (9 ,'lote1')
insert into #Lotes values (10 ,'lote1')
insert into #Lotes values (11 ,'lote1')

select lote, min(Estaca) De, max(Estaca) Ate from #Lotes group by lote

Link para o comentário
Compartilhar em outros sites

  • 0

Bom dia Pedro,

Então deixa eu entender o que precisa:

- Os dados da coluna Estaca são únicas. Não há repetição.

- O campo Lote pode conter dados repetidos e fora da ordem.

No sql que postei, peguei apenas o mínimo e o máximo das estacas e fiz o agrupamento dos lotes.

No seu exemplo:

estaca lote

1 lote1

2 lote1

3 lote1

4 lote2

5 lote2

6 lote2

7 lote3

8 lote1

9 lote1

10 lote1

11 lote1

Ficou o resultado:

Lote DE ATE

lote1 | 1 | 11

lote2 | 4 | 6

lote3 | 7 | 7

Se você estiver querendo pegar os intervalos entre os números das estacas (com seus respectivos lotes), aí esta sintaxe não funcionará. Para esta solucção, o que deverá ser feito:

- Criar uma temporária com uma ordenação por Estaca e Lote, nesta ordem.

- Fazer um loop para verificar os intervalos numéricos.

Caso seja o segundo caso, provalvemente a implementação deverá ser realizada via Função ou Procedure. :.)

Link para o comentário
Compartilhar em outros sites

  • 0

resolvi em parte o problema usando o seguinte SQL:

SELECT MIN(estaca) as menor_estaca, MAX(estaca) as maior_estaca, estatus, CONVERT(CHAR, data, 103) as data

FROM tbl_atual

WHERE estaca < 1000

GROUP BY estatus, CONVERT(CHAR, data, 103)

ORDER BY menor_estaca ASC

Mas preciso de uma outra condição, o intervalo não pode ser maior que 100, nesse codigo que mostrei ele me agrupara tudo independente da quantidade de valores no intervalo.. Teria que ter algo tipo um contador queverificasse: chegou a 100 faz um novo agrupamento...

Link para o comentário
Compartilhar em outros sites

  • 0

Bom... já estamos caminhando. rs.

Pra seccionar por intervalo, aí você terá que criar uma temporária com loop, pois terá que manipular os dados do resultado.

Fiz um exemplo explicativo pra você logo abaixo. Aí você adapta à sua necessidade.

-- Criação de tabela de teste
create table #Lotes (Estaca int, Lote varchar(10))

insert into #Lotes values (1 ,'lote1')
insert into #Lotes values (2 ,'lote1')
insert into #Lotes values (3 ,'lote1')
insert into #Lotes values (4 ,'lote2')
insert into #Lotes values (5 ,'lote2')
insert into #Lotes values (6 ,'lote2')
insert into #Lotes values (7 ,'lote3')
insert into #Lotes values (8 ,'lote1')
insert into #Lotes values (9 ,'lote1')
insert into #Lotes values (10 ,'lote1')
insert into #Lotes values (11 ,'lote1')

-- Vrificação
select * from #Lotes

-- Criação de temporária para manipulação
create table #Agrupamento (Lote varchar(10), De int, Ate int, Controle int identity)

-- Inserção do resultado
insert into #Agrupamento
select lote, min(Estaca) De, max(Estaca) Ate from #Lotes group by lote

-- Declaração de variaveis
-- Selecione tudo para abaixo e rode até o END
Declare @Controle int
Declare @De int
Declare @Ate int
Declare @Intervalo int
Declare @Lote varchar(10)

Set @Controle = 1

-- Loop
While @Controle <= (select max(controle) from #Agrupamento)
Begin
  -- resgata os valores que serão manipualdos
  set @Lote = (select lote from #Agrupamento where controle=@Controle)
  set @De = (select de from #Agrupamento where controle=@Controle)
  set @Ate = (select Ate from #Agrupamento where controle=@Controle)

  -- Verifica se o intervalo é maior que 100. No meu caso, coloquei o intervalo maior que 3 para testes.
  if (@Ate - @De) > 3
  Begin
    Set @Intervalo = (@De + 3)
    -- insere na tabela. Como possui a coluna Controle identity, os dados passarão nomvamente por verificação.
    insert into #Agrupamento values (@Lote, @De, @Intervalo)
    insert into #Agrupamento values (@Lote, @Intervalo, @Ate)
    -- Deleta o intervalo pesquisado
    delete from #Agrupamento where controle=@Controle
  End
  -- incrementa o controle.
  set @Controle = @Controle + 1

End

-- Verificação do resultado
select * from #Agrupamento order by lote, de

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,8k
×
×
  • Criar Novo...