Ir para conteúdo

Arquivado

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

tanaka_

Agrupamento

Recommended Posts

Boa tarde,

Senhores.


Eu sou estudante e tenho pouco conhecimento com sql. Onde trabalho utilizo o sql para montar alguns relatórios.

Preciso fazer um relatório onde eu tenha as seguinte informações;


Nome,

codigo,

e ultima data de venda de cada ponto de venda.



SELECT NM_PONTO_VENDA, CD_PONTO_VENDA, MAX(DT_VENDA) As UltimaVenda

FROM CON002 GROUP BY CD_Ponto_Venda


Porém, da erro.



Msg 8120, Level 16, State 1, Line 1

Column 'CONBI002.NM_Pessoa' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.


Alguém pode me ajudar?!

Grato.

Compartilhar este post


Link para o post
Compartilhar em outros sites

SELECT NM_PONTO_VENDA, CD_PONTO_VENDA, MAX(DT_VENDA) As UltimaVenda

FROM CON002

GROUP BY nm_ponto_venda , CD_Ponto_Venda

 

Tente isto

Compartilhar este post


Link para o post
Compartilhar em outros sites

Boa noite,

 

Motta.

 

Quando agrupo desta forma eu repito varias vezes os pontos de vendas, porque tenho varias pessoas que são de determinado ponto de venda.

Meu objetivo com a consulta e saber qual foi a ultima venda cadastrado de um determinado ponto independente da pessoa que o vendeu.

 

De qualquer forma eu sou grato pela ajuda.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mas existe mais de um CD_PONTO_VENDA ?

Não é chave única ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Boa noite,

Senhores.

 

Sim existe mais de um ponto de venda.

 

O cenário atual é o seguinte;

Existe vários pontos de vendas, porém, dentro de cada ponto de venda existe varias pessoas que efetuam vendas. No entanto, só é necessário trazer somente a ultima data registrada de cada ponto de venda, independente da pessoal que o fez.

 

Quando efetuo a consulta abaixo ele me retorna exatamente o que eu preciso, com exceção do nome da pessoa que está vinculado ao ponto de venda.

 

SELECT CD_PONTO_VENDA, MAX(DT_VENDA) As UltimaVenda
FROM CON002 GROUP BY CD_Ponto_Venda
Me retorna cerca de 500 registro.
Quando utilizo o que você me orientou esse número aumente expressivamente.

SELECT NM_PONTO_VENDA, CD_PONTO_VENDA, MAX(DT_VENDA) As UltimaVenda

FROM CON002

GROUP BY nm_ponto_venda , CD_Ponto_Venda

 

 

Acho que terei que encontrar uma forma de puxar esses dados sem o group by.

 

Grato pela atenção.



Precisava que me retornasse as informações desse sql abaixo;

 

SELECT
A.NM_Pessoa,
A.CD_Ponto_Venda,
MAX(A.DT_VENDA) As UltimaVenda
FROM CON002 A
GROUP BY A.CD_Ponto_Venda
Mas como existe um agrupamento ele da erro.
Msg 8120, Level 16, State 1, Line 1
Column 'CONBI002.NM_Pessoa' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.

Compartilhar este post


Link para o post
Compartilhar em outros sites

tente assim

 

 

--max

 

SELECT NM_PONTO_VENDA, CD_PONTO_VENDA, MAX(DT_VENDA) 
FROM CON002
GROUP BY nm_ponto_venda , CD_Ponto_Venda

 

--estes "caras"

 

 

SELECT      A.NM_Pessoa,
            A.CD_Ponto_Venda,
            A.DT_VENDA As UltimaVenda   
FROM CON002 A
WHERE (NM_PONTO_VENDA, CD_PONTO_VENDA, DT_VENDA) 
IN (SELECT NM_PONTO_VENDA, 
           CD_PONTO_VENDA, 
           MAX(DT_VENDA) 
    FROM CON002
    GROUP BY nm_ponto_venda , CD_Ponto_Venda)

Compartilhar este post


Link para o post
Compartilhar em outros sites

d8sb.jpgTa

Ta apresentando a seguinte mensagem.

 

Msg 4145, Level 15, State 1, Line 5

An expression of non-boolean type specified in a context where a condition is expected, near ','.


Tentei substituir por and no lugar da virgula, mas, sem sucesso.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não é IN, é EXISTS



Olhando direito a sintaxe do post #1,

SELECT NM_PONTO_VENDA             , CD_PONTO_VENDA             , MAX(DT_VENDA) As UltimaVendaFROM CON002GROUP BY NM_PONTO_VENDA, CD_Ponto_Venda

O resultado já não seria a última venda por NM_PONTO_VENDA???
Qual o resultado que esta aparecendo e o resultado esperado?
Att.

Compartilhar este post


Link para o post
Compartilhar em outros sites

No #7 é uma síntaxe que funciona no Oracle, não sei se roda de fato no SqlServer

 

 

select *
from tabela
where (campo1,campo2) in (select campo1,campo2
                          from tabela
                          where ...) 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Motta,

 

neste caso tem que fazer um join entre as consultas:

 

 
select * from 
(select * from tabela) a
inner join (select * from tabela) b
on a.xxx=b.xxx
where (condicao...)

 

Por isso perguntei o resultado esperado, pois deste modo, pode-se fazer o join acima ou até mesmo uma CTE.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Boa noite,

Senhores.

 

No caso Sr.A.Jr, o que estou tentando extrair está na mesma tabela, neste caso tem que fazer relacionamento com ela mesma!?

 

Conforme falei no poste anteior #6, está consulta me retorna exatamente o que preciso: Código do ponto de venda e data da ultima venda cadastrada no ponto, como foi agrupado pelo cd_ponto_venda, eu não consigo trazer mais uma informação que é muito importante para o relatório... o nome da pessoa.

 

SELECT CD_PONTO_VENDA, MAX(DT_VENDA) As UltimaVenda
FROM CON002 GROUP BY CD_Ponto_Venda

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sou contra, mas um subselect resolveria, desde que não tenha mais de um NM_Pessoa para CD_PONTO_VENDA

 

 SELECT a.CD_PONTO_VENDA, MAX(a.DT_VENDA) As UltimaVenda, (SELECT b.NM_Pessoa from CON002 b where b.CD_PONTO_VENDA = a.CD_PONTO_VENDA) FROM CON002 aGROUP BY a.CD_Ponto_Venda
[]´s


ah, e antes de mais nada, Sr não né :p

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom dia.

 

Não deu certo.

 

Apresenta a seguinte mensagem.

 

Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.

 

Nesta tabela existe sim mais de um nome de pessoa para um ponto de venda.

 

Como eu informei no post eu estou aprendendo sql, agora estou buscando curso.. conteúdo para estudo.

 

Se vocês souberem que algum por favar me passem.

 

Neste momento estou fazendo o da Soft Blue.

 

Grato.

 

 

SELECT NM_PONTO_VENDA, CD_PONTO_VENDA, ,DT_VENDA ,NM_PESSOA
FROM CON002 ,
(SELECT NM_PONTO_VENDA, CD_PONTO_VENDA, MAX(DT_VENDA) AS ULTIMAVENDA
FROM CON002
GROUP BY CD_PONTO_VENDA) CON002MAX
WHERE CON002.CD_PONTO_VENDA = CON002MAX.CD_PONTO_VENDA
AND CON002.NM_PONTO_VENDA = CON002MAX.NM_PONTO_VENDA
AND CON002.DT_VENDA = CON002MAX.DT_VENDA

Compartilhar este post


Link para o post
Compartilhar em outros sites

A.Jr

Sou contra, mas um subselect resolveria, desde que não tenha mais de um NM_Pessoa para CD_PONTO_VENDA

 

Tente a query do #7 concatenando

 

 

SELECT      A.NM_Pessoa,
            A.CD_Ponto_Venda,
            A.DT_VENDA As UltimaVenda   
from CON002 a
WHERE NM_PONTO_VENDA+CD_PONTO_VENDA+DT_VENDA
IN (SELECT NM_PONTO_VENDA+CD_PONTO_VENDA+MAX(DT_VENDA)
    from CON002
    GROUP BY nm_ponto_venda , CD_Ponto_Venda)

Coloquei o mais "+" mas não sei se é assim que concatena

 

Observação, esta query pode demorar

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Motta,

o "+" concatena sim, campos textos. Se um deles for =! de texto vai dar erro.

 

@tanaka_

Como que se associa um NM_PONTO_VENDA a um CD_PONTO_VENDA ou o relacionamento é 1 >º N ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

SELECT NM_PONTO_VENDA, CD_PONTO_VENDA, ,DT_VENDA ,NM_PESSOA
FROM CON002 ,
     (SELECT NM_PONTO_VENDA, CD_PONTO_VENDA, MAX(DT_VENDA) AS ULTIMAVENDA
      FROM CON002
      GROUP BY CD_PONTO_VENDA) CON002MAX
WHERE SELECT NM_PONTO_VENDA, CD_PONTO_VENDA, MAX(DT_VENDA) AS DT_VENDA
FROM CON002.CD_PONTO_VENDA = CON002MAX.CD_PONTO_VENDA   
AND  CON002.NM_PONTO_VENDA = CON002MAX.NM_PONTO_VENDA
AND  CON002.DT_VENDA = CON002MAX.DT_VENDA

 

SELECT NM_PONTO_VENDA, CD_PONTO_VENDA, ,DT_VENDA ,NM_PESSOA
FROM CON002 ,
     (SELECT NM_PONTO_VENDA, CD_PONTO_VENDA, MAX(DT_VENDA) AS ULTIMAVENDA
      FROM CON002
      GROUP BY CD_PONTO_VENDA) CON002MAX
WHERE CON002.CD_PONTO_VENDA = CON002MAX.CD_PONTO_VENDA   
AND  CON002.NM_PONTO_VENDA = CON002MAX.NM_PONTO_VENDA
AND  CON002.DT_VENDA = CON002MAX.DT_VENDA

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Motta,

o "+" concatena sim, campos textos. Se um deles for =! de texto vai dar erro.

 

@tanaka_

Como que se associa um NM_PONTO_VENDA a um CD_PONTO_VENDA ou o relacionamento é 1 >º N ?

 

Sim 1 para muitos.

 

Essa tabela é uma espécie de concentrador do BI. Como está contido toda a informação que preciso nela não estou utilizando a tabela de pessoa, onde eu posso dar um inner join associando pelo id_cota

Compartilhar este post


Link para o post
Compartilhar em outros sites


SELECT NM_PONTO_VENDA, CD_PONTO_VENDA, ,DT_VENDA ,NM_PESSOA

FROM CON002 , (SELECT NM_PONTO_VENDA, CD_PONTO_VENDA, MAX(DT_VENDA) AS ULTIMAVENDA

FROM CON002

GROUP BY CD_PONTO_VENDA) CON002MAX

WHERE CON002.CD_PONTO_VENDA = CON002MAX.CD_PONTO_VENDA

AND CON002.NM_PONTO_VENDA = CON002MAX.NM_PONTO_VENDA

AND CON002.DT_VENDA = CON002MAX.DT_VENDA

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.