UNION e GROUP BY numa consulta SQL

4,972 views
Skip to first unread message

Ana Paula

unread,
Sep 1, 2010, 3:58:53 PM9/1/10
to LISTA PHP
Estou com dificuldades em montar uma consulta ao banco, preciso usar o
GROUP BY e o UNION mas os registros ficam duplicados. Alguém pode me
ajudar?

Segue a query para analase:

SELECT upper( s.nome ) AS setor, upper( m.nome ) AS campus,
count( c.siape ) AS total
FROM cad_doc_efe c
INNER JOIN cad_setor s ON c.setor = s.id
INNER JOIN cad_campus m ON c.campus = m.id
WHERE c.campus =5
GROUP BY setor

UNION

SELECT upper( s.nome ) AS setor, upper( m.nome ) AS campus,
count( c.siape ) AS total
FROM cad_doc_sub c
INNER JOIN cad_setor s ON c.setor = s.id
INNER JOIN cad_campus m ON c.campus = m.id
WHERE c.campus =5
GROUP BY setor

UNION

SELECT upper( s.nome ) AS setor, upper( m.nome ) AS campus,
count( c.siape ) AS total
FROM cad_tec_adm c
INNER JOIN cad_setor s ON c.setor = s.id
INNER JOIN cad_campus m ON c.campus = m.id
WHERE c.campus =5
GROUP BY setor

ORDER BY campus, setor

Obrigada,

Suissa

unread,
Sep 1, 2010, 6:33:17 PM9/1/10
to list...@googlegroups.com
Bom não sei se pode ser o UNION ou o INNER JOIN, tenta por left join. Mas sem ver o banco fica meio dificil eu dar alguma opiniao correta.

--
============================================================
LEIAM SEMPRE AS REGRAS DA LISTA:
http://groups.google.com.br/group/listaphp/web/regras-da-lista-php
--
LISTA PHP > http://groups.google.com.br/group/listaphp
--
REVISTA PHP > http://www.revistaphp.com.br
--
AJAX-BRASIL > http://groups.google.com/group/ajax-brasil
--
PYTHON-GOOGLE > http://groups.google.com.br/group/python-google
--
DOTNET-BRASIL > http://groups.google.com.br/group/dotnet_br
============================================================



--
Jean C. Nascimento aka Suissa
Prof. Análise e Soluções Web Fafit/Facic - Itararé - SP

NoSQL Evangelist - MongoDB Contributor
nosqlbr.com.br/

iGrape Evangelist - Coordenador Geral
http://igrape.org

TheWebMind Evangelist - Coordenador de Interface & NoSQL
http://thewebmind.org/


rafhael honda

unread,
Sep 1, 2010, 6:44:27 PM9/1/10
to list...@googlegroups.com
tira os groups das selects , faça uma select por fora nela vc faz o grpup.

felipe moraes

unread,
Sep 1, 2010, 7:00:36 PM9/1/10
to list...@googlegroups.com
A PRINCIPIO. ..

só se os dados satisfazerem a mais de um consulta :D

pq até onde pude perceber, tá tudo ok

faz como falaram ..

testa individualmente cada uma .. anota os resultados .. e verifica qual dado está nas 2 pesquisas e por que ..

se não quiser que duplique .. tenta usar DISTINCT

ou em ultimo caso força uma subquery desta query

vinicius perroni

unread,
Sep 1, 2010, 11:08:17 PM9/1/10
to list...@googlegroups.com
Ana sem o banco fica meio difícil dizer qual o problema, mas o caminho é mesmo ir testando cada uma das consultas.

Tirei os INNER JOIN que estavam duplicados para ver se resolve. Pode testar ai... 


SELECT 
upper(s.nome) AS setor, upper(m.nome) AS campus, count(c.siape) as total
FROM 
(
SELECT
upper( s.nome ) AS setor, upper( m.nome ) AS campus, count( c.siape ) AS total
FROM cad_doc_sub c
WHERE c.campus = 5
GROUP BY setor
UNION
SELECT 
upper( s.nome ) AS setor, upper( m.nome ) AS campus, count( c.siape ) AS total
FROM cad_doc_efe c
WHERE c.campus = 5
GROUP BY setor
  
UNION
SELECT 
upper( s.nome ) AS setor, upper( m.nome ) AS campus, count( c.siape ) AS total
FROM cad_tec_adm c
WHERE c.campus = 5
GROUP BY setor
) AS aux
       INNER JOIN cad_setor s ON c.setor = s.id
       INNER JOIN cad_campus m ON c.campus = m.id
ORDER BY campus, setor


Vinicius Perroni

hnrq

unread,
Sep 1, 2010, 8:38:22 PM9/1/10
to list...@googlegroups.com
SELECT * FROM (


SELECT upper( s.nome ) AS setor, upper( m.nome ) AS campus,
count( c.siape ) AS total
  FROM cad_doc_efe c
     INNER JOIN cad_setor s ON c.setor = s.id
     INNER JOIN cad_campus m ON c.campus = m.id
  WHERE c.campus =5

UNION

SELECT upper( s.nome ) AS setor, upper( m.nome ) AS campus,
count( c.siape ) AS total
  FROM cad_doc_sub c
     INNER JOIN cad_setor s ON c.setor = s.id
     INNER JOIN cad_campus m ON c.campus = m.id
  WHERE c.campus =5

UNION

SELECT upper( s.nome ) AS setor, upper( m.nome ) AS campus,
count( c.siape ) AS total
  FROM cad_tec_adm c
     INNER JOIN cad_setor s ON c.setor = s.id
     INNER JOIN cad_campus m ON c.campus = m.id
  WHERE c.campus =5
 


) GROUP BY setor,campus ORDER BY campus, setor

Algo assim...
Henrique Lauro Bagio de Souza.



2010/9/1 felipe moraes <feli...@gmail.com>

--

Ana Paula

unread,
Sep 3, 2010, 7:26:36 AM9/3/10
to LISTA PHP
Valeu gente, consegui resolver... Estava tudo certinho, faltava só um
select do resultado desses UNION.

Obrigada!



On 1 set, 16:58, Ana Paula <anapaula.goncalves.olive...@gmail.com>
wrote:
Reply all
Reply to author
Forward
0 new messages