Jump to content

brunoguitarman

Members
  • Content count

    143
  • Joined

  • Last visited

Community Reputation

0 Comum

About brunoguitarman

  1. brunoguitarman

    Sql Complicado - Dor de cabeça!

    Considerando que todo mês tem uma nova entrada de dados, sempre me interessam os dados entrados apenas naquele mês, então eu sei que vou sempre terminar com um GROUP BY ano, mes, ... Também me interessa o programa, o que vai me gerar um GROUP BY ano, mes, programa e no fim, o select que devo fazer é SELECT ano, mes, programa, COUNT(indicador) 'Total'. Agora, sabendo dessas ligações, eu pego primeiro os que têm status A, ou seja, atual. Verificando a periodicidade deles, eu devo verificar se existem registros de metas, status F, suficientes desse mesmo indicador, dentro do mesmo programa, dentro do mesmo mês, dentro do mesmo ano. Por exemplo, eu pego um registro que tem status A, verifico que sua periodicidade é mensal. Esse registro é de junho de 2014. Agora eu tenho que ver pra esse mesmo registro, esse indicador, dentro do mesmo programa tem que ter mais 6 linhas (por que a periodicidade é mensal), que tenham status F. Uma pra Julho, outra pra Agosto, outra pra Setembro, Outubro, Novembro e Dezembro. Se falhar algum dos meses, já não me serve mais. Tem que ter todos meses. Essa data eu verifico na coluna 'data', que é a coluna que diz a quando se referem esses dados. As colunas ano e mês são referentes à entrada de dados, não aos dados em si, ou seja, quando foi importada a planilha.
  2. brunoguitarman

    Sql Complicado - Dor de cabeça!

    Não entendeu os dados, ou não entendeu o que quero fazer com eles?
  3. brunoguitarman

    Sql Complicado - Dor de cabeça!

    Atualmente a tabela está com 334.224 registros. Na última entrada de dados foram inseridos 12 mil registros, que creio que seja a média de entrada de dados mensal.
  4. brunoguitarman

    Sql Complicado - Dor de cabeça!

    Desculpe a ignorância, mas o que seria a volumetria?
  5. brunoguitarman

    Sql Complicado - Dor de cabeça!

    Sim, qualquer dia daquele mês pode haver a meta. Por exemplo: um indicador pode ter sido cadastrado dia 06/05, outro dia 08/05, outro 14/05. Pra mim o dia tanto faz. O que me importa é o mês. Tentei fazer um frankenstein aqui. Mesmo que horrível parece funcionar para o mensal, agora preciso fazer para as demais periodicidades. E aceito sugestões para melhorar o meu: -- Conta quantos indicadores cada programa possui com medição e todas as metas e com periodicidade mensal. SELECT contagemMedicoesFuturas.Ano 'Ano', contagemMedicoesFuturas.Mes 'Mes', contagemMedicoesFuturas.programa 'programa', COUNT(contagemMedicoesFuturas.indicador) 'Total' FROM ( SELECT medicoesFuturasAgrupadas.Ano, medicoesFuturasAgrupadas.Mes, medicoesFuturasAgrupadas.programa, medicoesFuturasAgrupadas.acao, medicoesFuturasAgrupadas.indicador, medicoesFuturasAgrupadas.medicaoAtual, COUNT(medicoesFuturasAgrupadas.medicaoFutura) 'qtdMedicoesFuturas' FROM ( -- Seleciona todas medições futura agrupadas. SELECT medicoesComMetas.Ano, medicoesComMetas.Mes, medicoesComMetas.programa, medicoesComMetas.acao, medicoesComMetas.indicador, medicoesComMetas.medicaoAtual, medicoesComMetas.medicaoFutura FROM ( -- Busca as medições futuras (metas) com periodicidade mensal, -- que tenham uma medição atual atualizada. -- Ajusta todas as datas para poder agrupar alguma que eventualmente esteja no mesmo mês. SELECT medicaoAtual.Ano, medicaoAtual.Mes, medicaoAtual.programa, medicaoAtual.acao, medicaoAtual.indicador, DATETIMEFROMPARTS(YEAR(medicaoFutura.data),MONTH(medicaoFutura.data),1,0,0,0,0) 'medicaoFutura', DATETIMEFROMPARTS(YEAR(medicaoAtual.data),MONTH(medicaoAtual.data),1,0,0,0,0) 'medicaoAtual' FROM medicoes as medicaoFutura RIGHT JOIN ( SELECT medicaoAtual.Ano, medicaoAtual.Mes, medicaoAtual.programa, medicaoAtual.acao, medicaoAtual.indicador, medicaoAtual.periodicidade, medicaoAtual.data, medicaoAtual.medido FROM medicoes as medicaoAtual WHERE UPPER(LTRIM(RTRIM(medicaoAtual.verificado))) = 'SIM' AND UPPER(LTRIM(RTRIM(medicaoAtual.tipoAcao))) = 'CORRENTES' AND UPPER(LTRIM(RTRIM(medicaoAtual.status))) = 'A' AND UPPER(LTRIM(RTRIM(medicaoAtual.periodicidade))) = 'MENSAL' -- Medido diferente de zero ou justificado AND (medicaoAtual.medido <> 0 OR ( medicaoAtual.medido = 0 AND ((LTRIM(RTRIM(medicaoAtual.acaoIndicador)) <> '') OR (LTRIM(RTRIM(medicaoAtual.analiseIndicador)) <> '')) ) ) -- Deve ter sua medição no máximo no mês anterior AND DATETIMEFROMPARTS(YEAR(medicaoAtual.data),MONTH(medicaoAtual.data),1,0,0,0,0) >= DATEADD(MONTH, -1, DATETIMEFROMPARTS(medicaoAtual.Ano, medicaoAtual.Mes, 1,0,0,0,0)) GROUP BY medicaoAtual.Ano, medicaoAtual.Mes, medicaoAtual.programa, medicaoAtual.acao, medicaoAtual.indicador, medicaoAtual.periodicidade, medicaoAtual.data, medicaoAtual.medido ) as medicaoAtual ON (medicaoAtual.Ano = medicaoFutura.Ano AND medicaoAtual.Mes = medicaoFutura.Mes AND medicaoAtual.programa = medicaoFutura.programa AND medicaoAtual.acao = medicaoFutura.acao AND medicaoAtual.indicador = medicaoFutura.indicador) WHERE UPPER(LTRIM(RTRIM(medicaoFutura.verificado))) = 'SIM' AND UPPER(LTRIM(RTRIM(medicaoFutura.tipoAcao))) = 'CORRENTES' AND UPPER(LTRIM(RTRIM(medicaoFutura.status))) = 'F' AND UPPER(LTRIM(RTRIM(medicaoFutura.periodicidade))) = 'MENSAL' -- Meta diferente de zero ou justificada AND (medicaoFutura.meta <> 0 OR ( medicaoFutura.meta = 0 AND ((LTRIM(RTRIM(medicaoFutura.acaoIndicador)) <> '') OR (LTRIM(RTRIM(medicaoFutura.analiseIndicador)) <> '')) ) ) GROUP BY medicaoAtual.Ano, medicaoAtual.Mes, medicaoAtual.programa, medicaoAtual.acao, medicaoAtual.indicador, medicaoAtual.data,medicaoFutura.data ) as medicoesComMetas GROUP BY medicoesComMetas.Ano, medicoesComMetas.Mes, medicoesComMetas.programa, medicoesComMetas.acao, medicoesComMetas.indicador, medicoesComMetas.medicaoAtual, medicoesComMetas.medicaoFutura ) as medicoesFuturasAgrupadas GROUP BY medicoesFuturasAgrupadas.Ano, medicoesFuturasAgrupadas.Mes, medicoesFuturasAgrupadas.programa, medicoesFuturasAgrupadas.acao, medicoesFuturasAgrupadas.indicador, medicoesFuturasAgrupadas.medicaoAtual ) as contagemMedicoesFuturas -- A quantidade de medições futuras deve totalizar o restante de meses do ano WHERE contagemMedicoesFuturas.qtdMedicoesFuturas >= (12 - MONTH(contagemMedicoesFuturas.medicaoAtual)) GROUP BY contagemMedicoesFuturas.Ano, contagemMedicoesFuturas.Mes, contagemMedicoesFuturas.programa
  6. brunoguitarman

    Sql Complicado - Dor de cabeça!

    Acho que o A.Jr se irritou tanto que desistiu :P. Alguma ideia, povo?
  7. brunoguitarman

    Sql Complicado - Dor de cabeça!

    No momento minha maior dúvida é: Uma vez que eu tenho retornadas todas as linhas com as medições atuais, como faço para verificar para cada uma delas quais as suas metas e se ela possui todas as metas necessárias? O meu grande problema é que estou viciado no pensamento de uma linguagem de programação. Por exemplo, pegaria todas as linhas de medições atuais, percorreria todas elas buscando as metas. Verificaria se possui todas as metas. Finalmente incrementaria um contador. Isso cheio de foreachs, ifs e qualquer outra coisa que o valha. Eu não estou conseguindo pensar como fazer isso com o sql.
  8. brunoguitarman

    Sql Complicado - Dor de cabeça!

    Até essa parte ok hehehe.
  9. brunoguitarman

    Sql Complicado - Dor de cabeça!

    hahahaha. Valeu!
  10. brunoguitarman

    Sql Complicado - Dor de cabeça!

    O SQL é o 2012. É um sistema em php. A planilha é lida utilizando o phpexcel e guardada numa tabela que é idêntica à planilha, diferindo apenas que ela tem um ID como PK e as colunas ano e mês para controle de entrada de dados. Após isso, o sistema possui uma rotina em que utiliza esta e diversas outras tabelas para calcular os valores de outras variáveis. Essas variáveis, cada uma possui uma view que é feito um select para guardar os dados em uma tabela de histórico desses dados (sim, o banco de dados é meio tosco, mas não posso muda-lo). Posteriormente, para exibir os dados na tela, o sistema busca os dados somente dessa tabela histórico. O grande problema é que não estou conseguindo montar a lógica dos selects e subqueries. Aquela parte de buscar uma linha atual para depois verificar as futuras e somente contar quando houver todas as metas futuras necessárias está dando um nó na minha cabeça.
  11. brunoguitarman

    Sql Complicado - Dor de cabeça!

    Galera, preciso fazer um sql que está me dando dor de cabeça. Talvez alguém aí possa me ajudar. Tenho um conjunto de dados como o que segue id Ano Mes programa acao etapa tipoAcao indicador expectativa periodicidade cargo setor orgao data meta medido desempenho cor acaoIndicador analiseIndicador verificado dataInicial dataFinal status 566690 2014 6 CIDADE DA PARTICIPAÇÃO AÇÕES DE POLÍTICAS SOCIAIS NULL Correntes Ações de Empoderamento Local da Comunidade Santo André Aumentar quadrimestral Líder da Ação Governança Rede de Sustentabilidade e Cidadania SMGL 2014-04-30 00:00:00.000 1 1 100 VD Sim 2014-01-01 00:00:00.000 2014-04-30 00:00:00.000 A 566689 2014 6 CIDADE DA PARTICIPAÇÃO AÇÕES DE POLÍTICAS SOCIAIS NULL Correntes Ações de Empoderamento Local da Comunidade Santo André Aumentar quadrimestral Líder da Ação Governança Rede de Sustentabilidade e Cidadania SMGL 2014-08-31 00:00:00.000 2 0 0 VD Sim 2014-05-01 00:00:00.000 2014-08-31 00:00:00.000 F 566688 2014 6 CIDADE DA PARTICIPAÇÃO AÇÕES DE POLÍTICAS SOCIAIS NULL Correntes Ações de Empoderamento Local da Comunidade Santo André Aumentar quadrimestral Líder da Ação Governança Rede de Sustentabilidade e Cidadania SMGL 2014-12-31 00:00:00.000 3 0 0 VD Sim 2014-09-01 00:00:00.000 2014-12-31 00:00:00.000 F 564361 2014 6 CIDADE DA PARTICIPAÇÃO AÇÕES DE POLÍTICAS SOCIAIS NULL Correntes Intervenções para Melhoria do Atendimento das Políticas Sociais Aumentar semestral Lider da Ação Gabinete SMGL 2014-06-30 00:00:00.000 1 1 100 VD Sim 2014-01-01 00:00:00.000 2014-06-30 00:00:00.000 A 564360 2014 6 CIDADE DA PARTICIPAÇÃO AÇÕES DE POLÍTICAS SOCIAIS NULL Correntes Intervenções para Melhoria do Atendimento das Políticas Sociais Aumentar semestral Lider da Ação Gabinete SMGL 2014-12-31 00:00:00.000 2 0 0 VD Sim 2014-07-01 00:00:00.000 2014-12-31 00:00:00.000 F 564172 2014 6 CIDADE DA PARTICIPAÇÃO ARTICULAÇÃO DOS CONSELHOS MUNICIPAIS NULL Correntes Casa dos Conselhos Aumentar anual Líder da Ação Conselhos Municipais SMGL 2014-12-31 00:00:00.000 37 0 0 CZ Sim 2014-01-01 00:00:00.000 2014-12-31 00:00:00.000 F 564171 2014 6 CIDADE DA PARTICIPAÇÃO ARTICULAÇÃO DOS CONSELHOS MUNICIPAIS NULL Correntes Casa dos Conselhos Aumentar anual Líder da Ação Conselhos Municipais SMGL 2015-12-31 00:00:00.000 79 0 0 CZ Sim 2015-01-01 00:00:00.000 2015-12-31 00:00:00.000 F 564170 2014 6 CIDADE DA PARTICIPAÇÃO ARTICULAÇÃO DOS CONSELHOS MUNICIPAIS NULL Correntes Casa dos Conselhos Aumentar anual Líder da Ação Conselhos Municipais SMGL 2016-12-31 00:00:00.000 90 0 0 CZ Sim 2016-01-01 00:00:00.000 2016-12-31 00:00:00.000 F 564169 2014 6 CIDADE DA PARTICIPAÇÃO ARTICULAÇÃO DOS CONSELHOS MUNICIPAIS NULL Correntes Casa dos Conselhos Aumentar anual Líder da Ação Conselhos Municipais SMGL 2017-12-31 00:00:00.000 100 0 0 CZ Sim 2017-01-01 00:00:00.000 2017-12-31 00:00:00.000 F 564574 2014 6 CIDADE DA PARTICIPAÇÃO ARTICULAÇÃO DOS CONSELHOS MUNICIPAIS NULL Correntes Conselhos Municipais com Página WEB Aumentar anual Líder da Ação Gestão de Democracia Participativa SMGL 2013-12-31 00:00:00.000 0 6 0 CZ Sim 2013-01-01 00:00:00.000 2013-12-31 00:00:00.000 A 564573 2014 6 CIDADE DA PARTICIPAÇÃO ARTICULAÇÃO DOS CONSELHOS MUNICIPAIS NULL Correntes Conselhos Municipais com Página WEB Aumentar anual Líder da Ação Gestão de Democracia Participativa SMGL 2014-12-31 00:00:00.000 13 0 0 CZ Sim 2014-01-01 00:00:00.000 2014-12-31 00:00:00.000 F 564572 2014 6 CIDADE DA PARTICIPAÇÃO ARTICULAÇÃO DOS CONSELHOS MUNICIPAIS NULL Correntes Conselhos Municipais com Página WEB Aumentar anual Líder da Ação Gestão de Democracia Participativa SMGL 2015-12-31 00:00:00.000 26 0 0 CZ Sim 2015-01-01 00:00:00.000 2015-12-31 00:00:00.000 F O que acontece? Todo mês uma planilha é importada no sistema contendo dados brutos como esses. Cada vez que a planilha é importada é guardado o ano e o mês de importação (como podem ver, a coluna ano contém 2014 e a coluna mês contém 6). Pois bem, então preciso fazer um agrupamento no fim por ano e mês. No geral o que preciso fazer é para cada entrada de dados (essa planilha importada mensalmente) descobrir quantos indicadores tenho dentro de cada programa. Um programa é composto por ações e as ações possuem indicadores. Até aí tudo bem: faria o group by pelo ano, mes, data, programa, ação, indicador e depois faria um count dos indicadores. Agora a coisa complica um pouquinho. Você me pergunta por quê? Eu te respondo por quê! heheeh Sempre devemos considerar apenas o tipoAcao 'Correntes' e verificado = 'Sim'. Tá, mas, Brunoooo, o que tem de complicado nisso? Nada! É só colocar um where e pronto! OK, até aqui tudo bem. O problema mesmo começa agora: Temos a coluna 'status' no qual temos o valor 'A' para a medição atual e o valor 'F' para as metas do futuro. Temos vários tipos de medição, que podem ser verificados na coluna 'periodicidade'. Eles podem ser 'mensal', 'bimestral', 'trimestral', 'quadrimestral', 'semestral', ou 'anual'. Então primeiro precisamos selecionar um subconjunto no qual o status é 'A', a coluna data deve ser verificada de acordo com a periodicidade. Por exemplo, se a periodicidade for mensal, o valor da coluna deve ser algum dia de maio, se for quadrimestral, deve ser num dos últimos 4 meses, se for semestral deve ser num dos últimos 6 meses. Após fazer essa verificação, deve-se verificar se há valor na coluna 'medido'. Se esses requisitos forem preenchidos, ok, o indicador ainda pode ser contado, se não, está fora. Agora, devemos verificar se o indicador possui meta para o restante do tempo. As metas são verificadas quando a coluna status tem o valor 'F' e a coluna meta está preenchida, ou então, se ela não estiver preenchida, as colunas acaoIndicador e analiseIndicador devem estar preenchidas. Para um indicador com periodicidade mensal, no mês de junho, deve possuir metas para os próximos meses do ano (Jul, Ago, Set, Out, Nov, Dez). Se passar por isso tudo, ele pode entrar na conta da quantidade de indicadores que temos. Caso contrário, está fora. Exemplo: d Ano Mes programa acao etapa tipoAcao indicador expectativa periodicidade cargo setor orgao data meta medido desempenho cor acaoIndicador analiseIndicador verificado dataInicial dataFinal status 566690 2014 6 CIDADE DA PARTICIPAÇÃO AÇÕES DE POLÍTICAS SOCIAIS NULL Correntes Ações de Empoderamento Local da Comunidade Santo André Aumentar quadrimestral Líder da Ação Governança Rede de Sustentabilidade e Cidadania SMGL 2014-04-30 00:00:00.000 1 1 100 VD Sim 2014-01-01 00:00:00.000 2014-04-30 00:00:00.000 A 566689 2014 6 CIDADE DA PARTICIPAÇÃO AÇÕES DE POLÍTICAS SOCIAIS NULL Correntes Ações de Empoderamento Local da Comunidade Santo André Aumentar quadrimestral Líder da Ação Governança Rede de Sustentabilidade e Cidadania SMGL 2014-08-31 00:00:00.000 2 0 0 VD Sim 2014-05-01 00:00:00.000 2014-08-31 00:00:00.000 F 566688 2014 6 CIDADE DA PARTICIPAÇÃO AÇÕES DE POLÍTICAS SOCIAIS NULL Correntes Ações de Empoderamento Local da Comunidade Santo André Aumentar quadrimestral Líder da Ação Governança Rede de Sustentabilidade e Cidadania SMGL 2014-12-31 00:00:00.000 3 0 0 VD Sim 2014-09-01 00:00:00.000 2014-12-31 00:00:00.000 F Essas 3 linhas estão agrupadas pelo ano 2014, mês 6, programa CIDADE DA PARTICIPAÇÃO, ação AÇÕES DE POLÍTICAS SOCIAIS, indicador Ações de Empoderamento Local da Comunidade Santo André. Ele é um indicador quadrimestral. É verificado e seu tipo de ação é corrente. OK, ele entra nesses requisitos. A medição atual está em Abril. Como é quadrimestral, está valendo. Ele possui duas linhas com metas no futuro (Agosto e Dezembro). Então esse indicador entra para aquela contagem final. Mas caso não tivesse dezembro, por exemplo, já não entraria. Então, deu pra entender meu problema? Alguém pode me dar uma luz de como fazer todas essas verificações?
×

Important Information

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