- Este tópico contém 6 respostas, 4 vozes e foi atualizado pela última vez 16 anos, 3 meses atrás por
Leegemelgo.
-
AutorPosts
-
17 de novembro de 2009 às 5:29 pm #90940
Leegemelgo
ParticipantePreciso elaborar uma query que contemple a seguinte situação:
colunas mes, codigo e estado;
Preciso extrair as quantidades dos codigos que estão duplicados por mês, 2X, 3X e mais de 3X,
e o mais complicado que é saber quantos códigos se repetem somente em 6 dos 6 meses, 5 dos 6 meses(exemplo: se o código foi utilizado uma vez ou mais em 5 meses dos 6 possiveis), em 4 dos 6 meses, em 3 dos 6 meses, em 2 dos 6 meses, somente 1 vez nos 6 meses;Estou batendo cabeça e não chego a lugar nenhum, peço ajuda a vc’s.
Grato17 de novembro de 2009 às 6:01 pm #90942fsitja
ParticipanteFiquei com um monte de dúvidas, acho que fica mais fácil de entender se você der exemplo de dados de entrada e a saída esperada no relatório, por gentileza.
Não entendi bem de que 6 meses você está falando. Seis últimos meses? Se sim, seriam 6 últimos usando que data como referência?
E qual a definição de duplicado? Duplicado quando tem dois códigos iguais para um mesmo mês e estado, ou só mês, independente de estado?17 de novembro de 2009 às 6:27 pm #90946Leegemelgo
ParticipanteEu tenho uma tabela com as coluna mes e codigo, os meses envolvidos vão de 01 a 06, a tabela só possui os registros referentes a estes meses de modo que não precisarei fazer filtro por periodo. Mensalmente os codigos podem ser inseridos na base, são vários códigos e eventualmente eles podem se repetir, se isto acontecer é porque o usuário utilizou o sistema mais de uma vez naquele mes, ele podera utilizar o sistema a qualquer tempo e quantas vezes necessitar.
Basicamente quero saber a quantidade de clientes usaram a rede nos ultimos 6 meses todos os meses pelo menos 1 vez, 2x 3x >3x.
Então deverá haver o código todos os meses pelo menos uma vez, eu contarei este cara como 1 e somarei aos demais que se enquadram nesta condição, depois os códigos que exista todos os meses pelo menos 2 vezes, 3 e mais de 3x.Exemplo com dados de saída hipotéticos:
Mes 01 02 03 04 05 06
=1 10 10 10 10 10 10 > qtde que no mes de 01 a 06 utilizaram o sistema todos os meses pelo menos uma vez.
=2 05 08 06 07 20 03 > …pelo menos duas vezes.
=3 05 08 06 07 20 03 > …pelo menos tres vezes.
>3 05 08 06 07 20 03 > …pelo mais de 3 vezes.Não haverá dados de entrada.
ACHO que agora ficou mais compreensivel a questão..heheGrato.
17 de novembro de 2009 às 11:31 pm #90954Ishii
ParticipanteOlá,
Estou meio devagar hoje (acho que é o transito) e ainda não entendi muito bem exatamente o que você precisa, porém veja se o Rollup
http://download.oracle.com/docs/cd/B19306_01/server.102/b14223/aggreg.htm#sthref1612
Serve e te ajuda nisso, senão for isso precisaria entender melhor o relatório que você precisa…[]s Ishii
18 de novembro de 2009 às 12:01 am #90959fsitja
ParticipanteFiz essa query abaixo, pelo que entendi do exemplo. Ali ficou mais fácil de entender. O restante talvez precise de um exemplo específico também.
-- INICIO DADOS DE TESTE
with t as (
select trunc(sysdate, 'MM') dat_mes, 1 cod from dual
union all select trunc(add_months(sysdate, -1), 'MM'), 1 estado from dual
union all select trunc(add_months(sysdate, -2), 'MM'), 1 estado from dual
union all select trunc(add_months(sysdate, -2), 'MM'), 1 estado from dual
union all select trunc(add_months(sysdate, -2), 'MM'), 1 estado from dual
union all select trunc(add_months(sysdate, -0), 'MM'), 5 estado from dual
union all select trunc(add_months(sysdate, -1), 'MM'), 5 estado from dual
union all select trunc(add_months(sysdate, -2), 'MM'), 5 estado from dual
union all select trunc(add_months(sysdate, -3), 'MM'), 5 estado from dual
union all select trunc(add_months(sysdate, -4), 'MM'), 5 estado from dual
union all select trunc(add_months(sysdate, -5), 'MM'), 5 estado from dual
union all select trunc(add_months(sysdate, -2), 'MM'), 20 estado from dual
union all select trunc(add_months(sysdate, -2), 'MM'), 20 estado from dual
union all select trunc(add_months(sysdate, -4), 'MM'), 20 estado from dual
union all select trunc(add_months(sysdate, -5), 'MM'), 20 estado from dual)
-- FIM DADOS DE TESTE
-- INICIO DA QUERY
select t2.dat_mes,
count(case when num_acc_mes = 1 then 1 end) qtd_1x,
count(case when num_acc_mes = 2 then 1 end) qtd_2x,
count(case when num_acc_mes = 3 then 1 end) qtd_3x,
count(case when num_acc_mes = 4 then 1 end) qtd_4x_ou_mais,
count() qtd_total
from (select t.dat_mes,
t.cod,
count() num_acc_mes
from t
group by t.cod, t.dat_mes) t2
group by t2.dat_mes
order by t2.dat_mes desc
18 de novembro de 2009 às 2:26 am #90961burga
ParticipanteSe você quer saber dos códigos que aparecem em todos os meses, com pelo menos um dos meses aparecendo 1 vez:
SELECT mes, codigo, count() quantidade
FROM tabela
WHERE codigo IN (SELECT codigo
FROM (SELECT mes, codigo, count() quantidade
FROM tabela
GROUP BY mes, codigo)
GROUP BY codigo
HAVING count(*) > 5
AND MIN(quantidade) = 1)
GROUP BY mes, codigo;Para buscar códigos que aparecem todos os meses com no mínimo 2 repetições por mês (com um dos meses com exatamente 2 repetições) você altera essa linha:
AND MIN(quantidade) = 1
Para:
AND MIN(quantidade) = 2
mínimo 3 repetições por mes para (com um dos meses com exatamente 3 repetições):
AND MIN(quantidade) = 3
ou mais do que 3 repetições para:
AND MIN(quantidade) > 3Lembrando que o registro que aparecer em uma consulta não aparecerá na outra.
Agora se você quer que os registros que contém mais do que 3 repetições também apareçam em todas as outras consultas, os que possuem 3 repetições apareçam também na primeira e segunda consulta e assim por diante, você altera a igualdade e coloca uma desigualdade na condição citada, nas três primeiras consultas:1 ou mais:
MIN(quantidade) > 0
2 ou mais:
MIN(quantidade) > 1
3 ou mais:
MIN(quantidade) > 2E a quarta consulta continua com a desigualdade > 3.
18 de novembro de 2009 às 5:04 pm #90965Leegemelgo
Participante(Vou testar e posto se deu certo….vlw)
Deu certo a solução apresentada pelo Burga foi perfeito para a minha necessidade (valeu Burga) quanto a solução do Fsitja passou perto, mas a forma que a query foi elaborado me deixou com várias boas ideias na cabeça (fsitja obrigado pela dica). -
AutorPosts
- Você deve fazer login para responder a este tópico.