- Este tópico contém 8 respostas, 4 vozes e foi atualizado pela última vez 15 anos, 1 mês atrás por
luan.
-
AutorPosts
-
27 de janeiro de 2011 às 10:27 pm #97991
luan
ParticipanteBoa tarde galera, estou com um problema talvez por minha falta de experiência em pl/sql ainda não consegui enxergar..
è os seguinte tenho a seguinte query:
SELECT IDAGENDADADO, DTAGENDA
FROM (
SELECT DISTINCT B.IDAGENDADADO, A.DTAGENDA, H.IDTUSS
FROM AGENDA_DETAIL A
JOIN AGENDA_DADO B ON ( A.IDAGENDADADO = B.IDAGENDADADO )
JOIN AGENDA_SALA C ON ( B.IDSALA = C.IDSALA )
JOIN AGENDA_DADO_AUX H ON ( B.IDAGENDADADO = H.IDAGENDADADO )
WHERE A.FLAG = 'DISPONIVEL' AND
A.STATUS = 'ATIVADO' AND
B.FLAG = 'PRODUCAO' AND
B.STATUS = 'ATIVADO' AND
H.IDTUSS IN (2826,78)
)
GROUP BY IDAGENDADADO, DTAGENDA HAVING COUNT(*) > 1 ORDER BY DTAGENDA
A query funciona e traz o resultado esperado quando eu removo do select e do group by a coluna IDAGENDADADO, mas quando eu à coloco novamente não me traz resultados.
O problema é que junto com as DTAGENDA que eu retorno eu precisava tbm retornar os ids das respectivas, teria alguma outra forma de fazer isso sem comprometer a consulta?
Mto obrigado galera, e desculpem-me se for algo mto newbie 🙁
Abs
27 de janeiro de 2011 às 11:08 pm #97994Ishii
ParticipanteOlá,
Desculpe-me mas não entendi qual ID estamos falando… o IDAGENDADADO já deve retornar na consulta, não? Ou seria outra coluna?
Se for a coluna IDTUSS basta colocar no primeiro select e no group by e ver se isso vai retornar as linhas que vc precisa (pode ser que retorne duplicadas por exemplo).
Se for outra coluna deverá rever as subqueries.
[]s Ishii
28 de janeiro de 2011 às 12:10 am #97998luan
ParticipanteOla Ishii,
então quando eu acrescento o IDAGENDADADO no group by, a consulta nao me retorna nada…agora quando eu o removo do group by a consulta me retorna as linhas esperadas.28 de janeiro de 2011 às 12:21 am #97999Regis Araujo
ParticipanteOla.!
Bom.. se eu entendi bem..!!
Vc falou que se coloca a coluna IDAGENDADADO no group by ele não lhe retorna nada..!!
Bom.. vc entende o que é o GROUP BY ?? Ele faz simplesmente oq diz.. agrupa os dados.. da seguinte forma..!!
Se em uma tabela existir 2 linhas com o mesmo conteudo em um campo.. e vc usar a clausula group by, ele irá agrupar elas em apenas 1 linha e no campo “count” vai lhe retornar quantas vezes este valor se repete.!
O problema da sua consulta é a clausula HAVING COUNT(*) > 1
Ou seja, a relação entre IDAGENDADADO + DTAGENDA não se repete mais de 1 vez.. e quando vc adicona IDAGENDADADO no group by e com a clausula having count(*) > 1, isto obriga a mostrar apenas as relações que possuem mais de 1 repetição..!!
Retire o having count da sua consulta que vc terá o resultado que espera..!!
Bom.. é por isto q não aparece nenhum resultado na sua consulta com o group by IDAGENDADADO, DTAGENDA… mas se realmente será isto que vc precisa.. não tenho como saber..!!
Qualquer coisa.. posta ai..!!
Espero ter ajudado..
Abraços..!
28 de janeiro de 2011 às 12:25 am #98000fsitja
ParticipanteTenta dessa forma:
SELECT idagendadado, dtagenda
FROM (SELECT b.idagendadado,
a.dtagenda,
count(*) over (partition by a.dtagenda) cnt
FROM agenda_detail a
JOIN agenda_dado b ON (a.idagendadado = b.idagendadado)
JOIN agenda_sala c ON (b.idsala = c.idsala)
JOIN agenda_dado_aux h ON (b.idagendadado = h.idagendadado)
WHERE a.flag = 'DISPONIVEL'
AND a.status = 'ATIVADO'
AND b.flag = 'PRODUCAO'
AND b.status = 'ATIVADO'
AND h.idtuss IN (2826, 78)
GROUP BY b.idagendadado, a.dtagenda)
WHERE cnt > 1
ORDER BY dtagenda;
28 de janeiro de 2011 às 12:28 am #98001luan
ParticipanteValeu Thunder_Catz muito obrigado pelas explicações,
mas no meu caso oque acontece é que eu necessito da clausura having count() pelo seguinte, eu preciso exibir os dias nas agendas apenas se tiverem disponiveis horários para todos códigos tuss:
H.IDTUSS IN (2826,78).. Por isso uso having count() > (N -1)Vlw abs
28 de janeiro de 2011 às 12:34 am #98002fsitja
Participante[quote=”luan”:nw9wpa60]Valeu Thunder_Catz muito obrigado pelas explicações,
mas no meu caso oque acontece é que eu necessito da clausura having count() pelo seguinte, eu preciso exibir os dias nas agendas apenas se tiverem disponiveis horários para todos códigos tuss:
H.IDTUSS IN (2826,78).. Por isso uso having count() > (N -1)Vlw abs[/quote]
O que quer dizer o N-1?
N é o número de IDTUSS diferentes que você selecionou?
Se é isso talvez isso ajude a remover o 1 hardcoded:
SELECT idagendadado, dtagenda
FROM (SELECT b.idagendadado,
a.dtagenda,
count(*) over (partition by a.dtagenda) cnt
count(distinct h.idtuss) over () cnt_idtuss
FROM agenda_detail a
JOIN agenda_dado b ON (a.idagendadado = b.idagendadado)
JOIN agenda_sala c ON (b.idsala = c.idsala)
JOIN agenda_dado_aux h ON (b.idagendadado = h.idagendadado)
WHERE a.flag = 'DISPONIVEL'
AND a.status = 'ATIVADO'
AND b.flag = 'PRODUCAO'
AND b.status = 'ATIVADO'
AND h.idtuss IN (2826, 78)
GROUP BY b.idagendadado, a.dtagenda)
WHERE cnt > cnt_idtuss - 1
ORDER BY dtagenda;
28 de janeiro de 2011 às 5:37 pm #98009luan
Participantefsitja muito obrigado pela resposta.
Exatamente isso, N é o número de IDTUSS selecionados.A query que você mandou está retornando o erro:
00979. 00000 – “not a GROUP BY expression”
Estranho que tentei acrescentar um grup by final com idagendado, dtagenda, mas o erro persiste …Obrigado
28 de janeiro de 2011 às 10:41 pm #98024luan
Participantefsitja, resolvido, muito obrigado kra!
acabou ficando assim:
SELECT distinct idagendadado, dtagenda
FROM (SELECT distinct b.idagendadado,
a.dtagenda,
h.idtuss,
count(*) over (partition by a.dtagenda) cnt,
count(h.idtuss) over () cnt_idtuss
FROM agenda_detail a
JOIN agenda_dado b ON (a.idagendadado = b.idagendadado)
JOIN agenda_sala c ON (b.idsala = c.idsala)
JOIN agenda_dado_aux h ON (b.idagendadado = h.idagendadado)
WHERE a.flag = 'DISPONIVEL'
AND a.status = 'ATIVADO'
AND b.flag = 'PRODUCAO'
AND b.status = 'ATIVADO'
AND h.idtuss IN (2826, 78, 2636)
GROUP BY b.idagendadado, a.dtagenda,h.idtuss)
WHERE cnt > (N-1)
ORDER BY dtagenda;
Obrigado novamente galera, é muito bom poder aprender com todos os excelentes profissionais do forum!
Abraços[/code]
-
AutorPosts
- Você deve fazer login para responder a este tópico.