Jump to content

POWERED BY:

Archived

This topic is now archived and is closed to further replies.

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

Share this post


Link to post
Share on other 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
");

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other sites

Troque

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

por

count(pedidos.total) as total

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other sites

×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.