Ir para conteúdo

POWERED BY:

Arquivado

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

vitinho.vitor

[Resolvido] Ranking

Recommended Posts

Olá pessoal,

já postei sobre isso porém não me resolveu. Preciso fazer um ranking de vendas então preciso somar a coluna total agrupando por id_user e mostrar os 5 primeiros.

Não consigo fazer um SQL preciso.

Segue o meu:

$query_representante = mysql_query("
SELECT 
 pedidos.total, 
 pedidos.id_user, 
 pedidos.status, 
 pedidos.date, 
 usuarios.nome as nome_representante,
 usuarios.id
FROM 
 usuarios, 
 pedidos
WHERE 
 pedidos.id_user = usuarios.id AND 
 (pedidos.status = 'Faturado' OR pedidos.status = 'Entregue') AND 
 pedidos.date BETWEEN '2011-01-01' AND '2011-01-30'
GROUP BY usuarios.id
LIMIT 5
");
$cont = mysql_num_rows($query_representante);
$cont = 0;
$cont_exibe = 1;

while ($row = mysql_fetch_array($query_representante)) 
{
 $total_faturado_rep = $row['total'];
 $total_rep = $total_faturado_rep + $total_rep;
// imprimir.....
}

 

O que está errado?

 

Obrigado

Vitor

Compartilhar este post


Link para o post
Compartilhar em outros sites

USE SUM

$query_representante = mysql_query("
SELECT 
 SUM(pedidos.total) as  total, 
 pedidos.id_user, 
 pedidos.status, 
 pedidos.date, 
 usuarios.nome as nome_representante,
 usuarios.id
FROM 
 usuarios, 
 pedidos
WHERE 
 pedidos.id_user = usuarios.id AND 
 (pedidos.status = 'Faturado' OR pedidos.status = 'Entregue') AND 
 pedidos.date BETWEEN '2011-01-01' AND '2011-01-30'
GROUP BY usuarios.id
LIMIT 5
");

Compartilhar este post


Link para o post
Compartilhar em outros sites

Outer join retorna os não localizados de um join, bom para casos com o seu.

 

Com uma pequena busca acha exemplos neste sítio mesmo.

 

Manual

 

Busca

Compartilhar este post


Link para o post
Compartilhar em outros sites

Seria isso?

 

SELECT 
 pedidos.id_user, 
 pedidos.status, 
 pedidos.date, 
 usuarios.nome as nome_representante,
 usuarios.id,
 sum(count(pedidos.total)) as total
FROM 
 usuarios LEFT JOIN pedidos ON (pedidos.id_user = usuarios.id)
 pedidos
WHERE 
 (pedidos.status = 'Faturado' OR pedidos.status = 'Entregue') AND 
 pedidos.date BETWEEN '2011-01-01' AND '2011-01-30'
GROUP BY usuarios.id
ORDER BY total DESC

 

editei, faltou o ORDER

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá C. Medeiros,

acredito que seja isso porém existe um erro que eu não consegui localizar.

SELECT 
 pedidos.id_user, 
 pedidos.status, 
 pedidos.date, 
 usuarios.nome as nome_representante,
 usuarios.id,
 sum(count(pedidos.total)) as total
FROM 
 usuarios LEFT JOIN pedidos ON (pedidos.id_user = usuarios.id)
 pedidos
WHERE 
 (pedidos.status = 'Faturado' OR pedidos.status = 'Entregue') 
 AND pedidos.date BETWEEN '2011-01-01' 
 AND '2011-01-30'
GROUP BY usuarios.id
ORDER BY pedidos.total DESC

Erro: #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'pedidos

WHERE

(pedidos.status = 'Faturado' OR pedidos.status = 'Entregue')

' at line 10

 

Obrigado,

Vitor

Compartilhar este post


Link para o post
Compartilhar em outros sites

SELECT 
 pedidos.id_user, 
 pedidos.status, 
 pedidos.date, 
 usuarios.nome as nome_representante,
 usuarios.id,
 sum(count(pedidos.total)) as total
FROM 
 usuarios LEFT JOIN pedidos ON (pedidos.id_user = usuarios.id)
WHERE 
 (pedidos.status = 'Faturado' OR pedidos.status = 'Entregue') 
 AND pedidos.date BETWEEN '2011-01-01' 
 AND '2011-01-30'
GROUP BY usuarios.id
ORDER BY pedidos.total DESC

 

ficou um "pedidos" perdido abaixo do FROM, veja se funciona

Compartilhar este post


Link para o post
Compartilhar em outros sites

Deu outro erro! procurei no Google sobre ele e não achei nada.

 

#1111 - Invalid use of group function

 

Obrigado

 

Seguinte, coloquei umas crases e retornou outro erro.

Segue o código:

SELECT 
 pedidos.id_user, 
 pedidos.status, 
 pedidos.date, 
 usuarios.nome as nome_representante,
 usuarios.id,
 sum(count(`pedidos.total`)) AS total
FROM 
 usuarios LEFT JOIN pedidos ON (pedidos.id_user = usuarios.id)
WHERE 
 (pedidos.status = 'Faturado' OR pedidos.status = 'Entregue') 
 AND pedidos.date BETWEEN '2011-01-01' 
 AND '2011-01-30'
GROUP BY `usuarios.id`
ORDER BY `total` DESC

 

Erro: #1054 - Unknown column 'pedidos.total' in 'field list'

 

Obrigado

Vitor

Compartilhar este post


Link para o post
Compartilhar em outros sites

Posso errar a síntaxe pois sou viciado na do Oracle ...

 

mas ...

 

SELECT 
 pedidos.id_user, 
 pedidos.status, 
 pedidos.date, 
 usuarios.nome as nome_representante,
 usuarios.id,
 coalesce(sum(count(pedidos.total)),0) as total
FROM 
 usuarios LEFT OUTER JOIN pedidos ON (pedidos.id_user = usuarios.id)
WHERE 
 (((pedidos.status = 'Faturado' OR pedidos.status = 'Entregue') 
    AND pedidos.date BETWEEN '2011-01-01' 
    AND '2011-01-30') or pedidos.id_user is null))
GROUP BY pedidos.id_user, 
        pedidos.status, 
        pedidos.date, 
        usuarios.nome as nome_representante,
        usuarios.id
ORDER BY pedidos.total DESC

 

Se não for isto está perto.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Alterei um pouco a SQL porém ainda está dando o erro:

SELECT 
 pedidos.id_user, 
 pedidos.status, 
 pedidos.date, 
 usuarios.nome as nome_representante,
 usuarios.id,
 coalesce(sum(count(pedidos.total)),0) as total
FROM 
 usuarios LEFT OUTER JOIN pedidos ON (pedidos.id_user = usuarios.id)
WHERE 
 (((pedidos.status = 'Faturado' OR pedidos.status = 'Entregue') 
    AND pedidos.date BETWEEN '2011-01-01' 
    AND '2011-01-30' or pedidos.id_user is null))
GROUP BY usuarios.id
ORDER BY pedidos.total DESC

 

O erro é: #1111 - Invalid use of group function

 

Obrigado

Vitor

Compartilhar este post


Link para o post
Compartilhar em outros sites

O agrupamento deve "bater" com o select

 

SELECT 
 pedidos.id_user, 
 pedidos.status, 
 pedidos.date, 
 usuarios.nome as nome_representante,
 usuarios.id,
 coalesce(sum(count(pedidos.total)),0) as total
FROM 
 usuarios LEFT OUTER JOIN pedidos ON (pedidos.id_user = usuarios.id)
WHERE 
 (((pedidos.status = 'Faturado' OR pedidos.status = 'Entregue') 
    AND pedidos.date BETWEEN '2011-01-01' 
    AND '2011-01-30' or pedidos.id_user is null))
GROUP BY pedidos.id_user, 
        pedidos.status, 
        pedidos.date, 
        usuarios.nome,
        usuarios.id
ORDER BY pedidos.total DESC

Compartilhar este post


Link para o post
Compartilhar em outros sites

Troque

coalesce(sum(count(pedidos.total)),0) as total

por

count(pedidos.total) as total

Compartilhar este post


Link para o post
Compartilhar em outros sites

Muito bem,

Tenho o seguinte código:

SELECT 
 pedidos.id_user, 
 pedidos.status, 
 pedidos.date, 
 usuarios.nome as nome_representante,
 usuarios.id,
 count(pedidos.total) as total
FROM 
 usuarios LEFT OUTER JOIN pedidos ON (pedidos.id_user = usuarios.id)
WHERE 
 (((pedidos.status = 'Faturado' OR pedidos.status = 'Entregue') 
    AND pedidos.date BETWEEN '2011-01-01' 
    AND '2011-01-30' or pedidos.id_user is null))
GROUP BY pedidos.id_user, 
        pedidos.status, 
        pedidos.date, 
        usuarios.nome,
        usuarios.id
ORDER BY pedidos.total DESC
LIMIT 5

 

Porém tenho dúvidas sobre o que ele está fazendo.

 

Está somando os totais dos pedidos, agrupando por id_user e ordenando começando pelo que mais vendeu até o que vendeu menos?

 

Obrigado

Vitor

 

Pessoal, acho que consegui o que queria. Segue o código!

SELECT 
 pedidos.id_user, 
 pedidos.status, 
 pedidos.date, 
 usuarios.nome as nome_representante,
 usuarios.id,
 sum(pedidos.total) as total
FROM 
 usuarios LEFT OUTER JOIN pedidos ON (pedidos.id_user = usuarios.id)
WHERE 
 (((pedidos.status = 'Faturado' OR pedidos.status = 'Entregue') 
    AND pedidos.date BETWEEN '2011-01-01' 
    AND '2011-01-30' or pedidos.id_user is null))
GROUP BY pedidos.id_user, 
        usuarios.nome,
        usuarios.id
ORDER BY total DESC
LIMIT 5

 

Obrigado a todos!!!

 

Vitor

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.