Ir para conteúdo

Arquivado

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

bruno.teles

Limitar SELECT

Recommended Posts

Boa tarde,


Pessoal, SQL não é minha praia, mas preciso muito de uma ajuda com a questão abaixo, são dados de exemplo e especificamente o que eu quero.


Vamos lá:


Na tabela "Venda" tenho os campos


cod_venda,

nome_peca,

cod_peca,

cliente

...


Claro que diferentes clientes compraram o mesmo produto, mas eu precisava a partir de uma listagem de cod_peca trazer somente um cod_venda por cod_peca, um único registro para cada cod_peca que pode ser de qualquer cod_venda, isso não importa e é apenas pra ser usado em um outro processo.


Não é viável eu selecionar todos os dados assim...




SELECT *
FROM venda
WHERE cod_peca IN (100, 200, 300, 400, 500);



e depois separar o que eu quero, pq serão milhares de registros e eu vou perder muito tempo.


Eu preciso de algo que me retornasse apenas um registro do campo COD_PECA não importando a ordem das outras informações. E partir daí eu iria usar os resultados do campo COD_VENDA em um outro processo.


Exemplo:




COD_VENDA NOME_PECA COD_PECA CLIENTE
1 Borracha 100 João Silva
2 Caderno 200 Maria José
3 Lapis 300 José Maria
4 Estojo 400 Lucas Felipe
5 Mochila 500 Bruna Souza
7 Estojo 400 Rosana Silva
8 Caderno 200 Claudio Souza
9 Lapis 300 João Paulo
10 Estojo 400 Guilherme Oliveira
11 Mochila 500 Gustavo Abreu




Alguém, por favor, sabe de alguma cláusula/forma que consiga me ajudar selecionar esses dados?


Se ficou confuso me sinalizem.

Compartilhar este post


Link para o post
Compartilhar em outros sites
Boa tarde,
Pessoal, SQL não é minha praia, mas preciso muito de uma ajuda com a questão abaixo, são dados de exemplo e especificamente o que eu quero.
Vamos lá:
Na tabela "Venda" tenho os campos
cod_venda,
nome_peca,
cod_peca,
cliente
...
Claro que diferentes clientes compraram o mesmo produto, mas eu precisava a partir de uma listagem de cod_peca trazer somente um cod_venda por cod_peca, um único registro para cada cod_peca que pode ser de qualquer cod_venda, isso não importa e é apenas pra ser usado em um outro processo.
Não é viável eu selecionar todos os dados assim...
SELECT * 
  FROM venda
 WHERE cod_peca IN (100, 200, 300, 400, 500);
e depois separar o que eu quero, pq serão milhares de registros e eu vou perder muito tempo.
Exemplo:
Se eu utilizar isso
SELECT *
FROM venda
WHERE cod_peca IN (100, 200, 300, 400, 500);

Vai me retornar isso

COD_VENDA    NOME_PECA	   COD_PECA	CLIENTE
1	     Borracha	   100	        João Silva
2            Caderno	   200	        Maria José
3            Lapis	   300	        José Maria
4	     Estojo	   400	        Lucas Felipe
5	     Mochila	   500	        Bruna Souza
7	     Estojo	   400	        Rosana Silva
8            Caderno	   200	        Claudio Souza
9	     Lapis	   300	        João Paulo
10	     Estojo	   400	        Guilherme Oliveira
11	     Mochila	   500	        Gustavo Abreu

Eu preciso de algo que me retornasse apenas um registro de cada do campo COD_PECA (de acordo com meu WHERE) não importando a ordem das outras informações. E partir daí eu iria usar os resultados do campo COD_VENDA em um outro processo.
Um resultado como esse
COD_VENDA  NOME_PECA    COD_PECA    CLIENTE
1          Borracha     100         João Silva
3          Lapis        300         José Maria
4          Estojo       400         Lucas Felipe
8          Caderno      200         Claudio Souza
11         Mochila      500         Gustavo Abreu

 

Alguém, por favor, sabe de alguma cláusula/forma que consiga me ajudar selecionar esses dados?
Se ficou confuso me sinalizem.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não sei se entendi mas creio que o select do Aduato resolve.

Compartilhar este post


Link para o post
Compartilhar em outros sites

pode usar algo assim

 

SELECT *

FROM venda a

WHERE cod_peca IN (select max(cod_peca) from vendas b on b.cod_venda = a.cod_venda );

 

 

Adauto, não deu certo cara, foram os mesmos resultados.

 

RRuYLBH.png

 

Mas agora que eu percebi que meu exemplo estava incompleto, é mais ou menos assim:

 

Exemplo:
Se eu utilizar isso
SELECT *
FROM venda
WHERE cod_peca IN (100, 200, 300, 400, 500);

Vai me retornar isso

COD_VENDA NOME_PECA     COD_PECA    CLIENTE
1         Borracha      100         João Silva
2         Caderno       200         Maria José
3         Lapis         300         José Maria
4         Estojo        400         Lucas Felipe
5         Mochila       500         Bruna Souza
7         Estojo        400         Rosana Silva
8         Caderno       200         Claudio Souza
9         Lapis         300         João Paulo
10        Estojo        400         Guilherme Oliveira
11        Mochila       500         Gustavo Abreu
Eu preciso de algo que me retornasse apenas um registro de cada do campo COD_PECA (de acordo com meu WHERE) não importando a ordem das outras informações. E partir daí eu iria usar os resultados do campo COD_VENDA em um outro processo.
Um resultado como esse
COD_VENDA NOME_PECA    COD_PECA    CLIENTE
1         Borracha     100         João Silva
3         Lapis        300         José Maria
4         Estojo       400         Lucas Felipe
8         Caderno      200         Claudio Souza
11        Mochila      500         Gustavo Abreu

Compartilhar este post


Link para o post
Compartilhar em outros sites

talvez fique lento

SELECT  * 
FROM venda a
WHERE cod_venda IN (select max(cod_venda) from vendas b on b.cod_peca = a.cod_peca );

Compartilhar este post


Link para o post
Compartilhar em outros sites

Entendi, então seu max tem que ser no cliente e não na peça essa tabela venda tem chave da tabela cliente ?

 

se tiver ficaria codigo_cliente in(select max(cod_cliente) from cliente b where a.codigo_cliente = b.codigo_cliente)

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

talvez fique lento

SELECT  * 
FROM venda a
WHERE cod_venda IN (select max(cod_venda) from vendas b on b.cod_peca = a.cod_peca );

 

 

Entendi, então seu max tem que ser no cliente e não na peça essa tabela venda tem chave da tabela cliente ?

 

se tiver ficaria codigo_cliente in(select max(cod_cliente) from cliente b where a.codigo_cliente = b.codigo_cliente)

 

 

É isso mesmo pessoal, me pouparam muito tempo, consegui chegar ao meu resultado com esses códigos e esse outro aqui tb.

select *
from venda
where cod_venda in (select max(cod_venda)
                    from venda
                    group by cod_peca)
order by Cod_Peca 

Valeu Motta e Adauto!

Compartilhar este post


Link para o post
Compartilhar em outros sites
Problema já resolvido com qualquer dos códigos abaixo.



select *
from venda
where cod_venda in (select max(cod_venda)
from venda
group by cod_peca)
order by Cod_Peca




SELECT *
FROM venda a
WHERE cod_venda IN (select max(cod_venda) from vendas b on b.cod_peca = a.cod_peca );

Compartilhar este post


Link para o post
Compartilhar em outros sites

  • Conteúdo Similar

    • Por ILR master
      Boa tarde, pessoal.
      Espero que todos estejam bem.
       
      Seguinte:
      Tenho a seguinte consulta:
       
      $usuarios= "SELECT * FROM usuarios";
      $query= mysqli_query($conexao, $usuarios) or die ("Usuário não encontrado");
      $usuario = mysqli_fetch_array($query);
       
      Quero pegar apenas o campo 'nome' da tabela 'usuarios' e colocar todos os resultados da seguinte forma:
       
      $nomes = array("Rafael", "João", "Maria", "Pedro", "Patricia", "Camila");
       
      Agradeço desde já.
      Abs
       
       
    • Por FabianoSouza
      Eu preciso exibir duas informações em minha consulta:
      1) A quantidade de pessoas inscritas numa turma de treinamento (isso é feito com um simples COUNT)
      2) Uma flag de excesso de inscrições na turma. Seria obtido pela comparação entre a quantidade máxima permitida (já existe esse campo) e o COUNT feito acima.
       
      Até aqui sem problemas.
       
      O que quero é evitar fazer duas contagens (1 para saber a quantidade de inscritos, e outra para gerar a flag de excesso de inscrições).
       
      Há uma forma de utilizar UMA contagem para atender as duas necessidades?
       
      Meu código está assim:
       
      ... --AQUI FAZ A COMPARAÇÃO PARA GERAR A FLAG DE EXCESSO DE INSCRIÇÕES , CASE WHEN (SELECT COUNT(*) FROM dbo.tab AS ITT WHERE ITT.codTurmaDeTreina = T.id) > T.lotacaoMax Then T.nome + '&nbsp;'+'<span class=%22icon-aviso fcolor-critico%22 style=%22font-size:18px%22 title=Excesso&nbsp;de&nbsp;inscrições></span>' --AQUI FAZ A CONTAGEM DE INSCRIÇÕES , (SELECT COUNT(*) FROM dbo.tab AS ITT WHERE ITT.codTurmaDeTreina = T.id) AS 'Inscrições'  
    • Por FabianoSouza
      Possuo uma coluna de data.
      Eu gostaria que os registros com datas futuras aparecessem no topo do meu select, em relação aos demais registros.
      Em seguida, gostaria que somente esses registros com datas futuras ficassem em ordem crescente.
      Algo como 
       
      João  | 16/11/2023
      Maria | 17/11/2023
      José  |  20/11/2023
       
      -----------------------------
      (demais registros da base)
      Antônio   |  20/05/2023
      Rosa        | 15/08/2023
      Cida         | 15/10/2022
      Pedro      |  20/05/2021
      Paulo      |  14/11/2020
       
      O select seria esse.
      select dbo.formataData(ET.dataInicial) AS 'data' FROM dbo.tab AS ET GROUP BY ET.dataInicial  
    • Por FabianoSouza
      Tenho uma function que precisa receber 02 argumentos.
      Ela funciona se eu aplicar num select qualquer. Mas se eu aplicar num select dinâmico, ocorre erro.
      Veja trecho do meu select.
      ... SET @sql = @sql +', dbo.retornaIco_ItemBloq((SELECT COUNT(*) FROM dbo.tab AS TT2 WHERE TT2.codCategTreina = CTT.id),'+@title+') AS ''resp''' ... No caso, o primeiro argumento da function dbo.retornaIco_ItemBloq é um SELECT COUNT.
      O segundo argumento é uma variável (que está devidamente declarada e definida).
       
      O erro ocorre porque ao executar (chamando EXEC(@sql) ), o SQL entende que o segundo argumento é uma coluna da consulta principal, pois existe uma vírgula antes da variável @title (que é o segundo argumento da function).
      Repito. Se eu aplicar essa function num select normal, funciona normalmente. Porém, preciso que funcione num SQL dinâmico porque é esse é o padrão que estou adotando para o sistema todo.
       
      A function dbo.retornaIco_ItemBloq faz o seguinte:
      1) Recebe o valor do COUNT e da variável @title
      2) Se o COUNT for maior que  Zero, cria uma tag HTML (uma SPAN), define sua title com o valor da variável @title e passa para uma variável
      3) Retorna o HTML que será exibido no resultado da consulta principal
      É super simples.
       
      Há outra forma de chamar a function?
    • Por mamotinho
      Olá, estou a um tempo tentando acrescentar um codigo na coluna do SQL na qual seria VARBINARY

      A Coluna atual contém o seguinte codigo binary:
      Código (01)
      0x020009004C0101434D0101465C0101485D0101499801014B8401014E8501014F86010150D00009017A0014247D0014257B0014261600090201000903F9001420FA0014229F000923F8001427DF000128730014297600142A7E00142BFB00142CA3010147E000142DE100142EA40101443900120424001405C40101457400142F770014307F0001317C001232E6000421780001332C010A522F0108533A010354380103553001085637010357A5010166A6010167  
      No codigo acima eu gostaria de acrescentar o seguinte codigo:
      Código (02)
      0xCC010120CD010121CE010122CF010123
      no caso eu quero criar uma procedure que ao executar a função ele adicione o codigo 02 no código 01. no caso o codigo ficaria desta forma:

      0x020009004C0101434D0101465C0101485D0101499801014B8401014E8501014F86010150D00009017A0014247D0014257B0014261600090201000903F9001420FA0014229F000923F8001427DF000128730014297600142A7E00142BFB00142CA3010147E000142DE100142EA40101443900120424001405C40101457400142F770014307F0001317C001232E6000421780001332C010A522F0108533A010354380103553001085637010357A5010166A6010167CC010120CD010121CE010122CF010123



      Ficarei imensamente grato se alguém conseguir me ajudar, o orientar. sou iniciante nessa areá ainda.
×

Informação importante

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