selecionar dados por mês

Firebird

17/03/2010

Preciso selecionar os dados somando mes a mes, por exemplo:

O insumo 30 gastou 1000 kg no mes 01 e 1500 no mes 10

então fiz da seguinte forma:

        SQL = "SELECT DISTINCT A.COD_INSUMO," & _
         "(Select Sum(QUANTIDADE)as QTO From RECEITUARIO_AGRONOMICO_INSUMO Where RECEITUARIO_AGRONOMICO_INSUMO.COD_INSUMO=B.ID_INSUMO AND C.DATAP>='" & txtAno.Text & "-01-01'  AND C.DATAP<='" & txtAno.Text & "-01-31' ) as JANEIRO," & _
         "(Select Sum(QUANTIDADE)as QT1 From RECEITUARIO_AGRONOMICO_INSUMO Where RECEITUARIO_AGRONOMICO_INSUMO.COD_INSUMO=B.ID_INSUMO AND C.DATAP>='" & txtAno.Text & "-02-01'  AND C.DATAP<='" & txtAno.Text & "-02-28' ) as FEVEREIRO," & _
         "(Select Sum(QUANTIDADE)as QT2 From RECEITUARIO_AGRONOMICO_INSUMO Where RECEITUARIO_AGRONOMICO_INSUMO.COD_INSUMO=B.ID_INSUMO AND C.DATAP>='" & txtAno.Text & "-03-01'  AND C.DATAP<='" & txtAno.Text & "-03-31' ) as MARCO," & _
         "(Select Sum(QUANTIDADE)as QT3 From RECEITUARIO_AGRONOMICO_INSUMO Where RECEITUARIO_AGRONOMICO_INSUMO.COD_INSUMO=B.ID_INSUMO AND C.DATAP>='" & txtAno.Text & "-04-01'  AND C.DATAP<='" & txtAno.Text & "-04-30' ) as ABRIL," & _
         "(Select Sum(QUANTIDADE)as QT4 From RECEITUARIO_AGRONOMICO_INSUMO Where RECEITUARIO_AGRONOMICO_INSUMO.COD_INSUMO=B.ID_INSUMO AND C.DATAP>='" & txtAno.Text & "-05-01'  AND C.DATAP<='" & txtAno.Text & "-05-31' ) as MAIO," & _
         "(Select Sum(QUANTIDADE)as QT5 From RECEITUARIO_AGRONOMICO_INSUMO Where RECEITUARIO_AGRONOMICO_INSUMO.COD_INSUMO=B.ID_INSUMO AND C.DATAP>='" & txtAno.Text & "-06-01'  AND C.DATAP<='" & txtAno.Text & "-06-30' ) as JUNHO," & _
         "(Select Sum(QUANTIDADE)as QT6 From RECEITUARIO_AGRONOMICO_INSUMO Where RECEITUARIO_AGRONOMICO_INSUMO.COD_INSUMO=B.ID_INSUMO AND C.DATAP>='" & txtAno.Text & "-07-01'  AND C.DATAP<='" & txtAno.Text & "-07-31' ) as JULHO," & _
         "(Select Sum(QUANTIDADE)as QT7 From RECEITUARIO_AGRONOMICO_INSUMO Where RECEITUARIO_AGRONOMICO_INSUMO.COD_INSUMO=B.ID_INSUMO AND C.DATAP>='" & txtAno.Text & "-08-01'  AND C.DATAP<='" & txtAno.Text & "-08-31' ) as AGOSTO," & _
         "(Select Sum(QUANTIDADE)as QT8 From RECEITUARIO_AGRONOMICO_INSUMO Where RECEITUARIO_AGRONOMICO_INSUMO.COD_INSUMO=B.ID_INSUMO AND C.DATAP>='" & txtAno.Text & "-09-01'  AND C.DATAP<='" & txtAno.Text & "-09-31' ) as SETEMBRO," & _
         "(Select Sum(QUANTIDADE)as QT9 From RECEITUARIO_AGRONOMICO_INSUMO Where RECEITUARIO_AGRONOMICO_INSUMO.COD_INSUMO=B.ID_INSUMO AND C.DATAP>='" & txtAno.Text & "-10-01'  AND C.DATAP<='" & txtAno.Text & "-10-31' ) as OUTUBRO," & _
         "(Select Sum(QUANTIDADE)as QT10 From RECEITUARIO_AGRONOMICO_INSUMO Where RECEITUARIO_AGRONOMICO_INSUMO.COD_INSUMO=B.ID_INSUMO AND C.DATAP>='" & txtAno.Text & "-11-01'  AND C.DATAP<='" & txtAno.Text & "-11-30' ) as NOVEMBRO," & _
         "(Select Sum(QUANTIDADE)as QT11 From RECEITUARIO_AGRONOMICO_INSUMO Where RECEITUARIO_AGRONOMICO_INSUMO.COD_INSUMO=B.ID_INSUMO AND C.DATAP>='" & txtAno.Text & "-12-01'  AND C.DATAP<='" & txtAno.Text & "-12-31' ) as DEZEMBRO," & _
          "A.COD_INSUMO,B.ID_INSUMO,B.NOME_COMERCIAL " & _
          " FROM ((RECEITUARIO_AGRONOMICO_INSUMO A LEFT JOIN CAD_INSUMO B ON B.ID_INSUMO = A.COD_INSUMO) " & _
          " LEFT JOIN RECEITUARIO_AGRONOMICO C ON C.ID_RECEITUARIO_AGRONOMICO=A.COD_RECEITUARIO_AGRONOMICO)" & _
          " LEFT JOIN CAD_TIPOINSUMO D ON D.ID_TIPOINSUMO=B.TIPO_INSUMO" & _
          " WHERE C.COD_FAZENDA=" & Identificador_fazenda

Porem ele não esta trazendo 1000 kg em janeiro e 1500 em outubro, ele ta somando e aparecendo 2500 kg em janeiro e 2500 em outubro, como separar isto?
Paulo Henrique

Paulo Henrique

Curtidas 0

Respostas

Emerson Nascimento

Emerson Nascimento

17/03/2010

que informação é guardada nos campos QT0, QT1, QT2...QT11 ???
GOSTEI 0
Paulo Henrique

Paulo Henrique

17/03/2010

Não guarda nada, simplesmente coloquei ali porque ao meu ponto de vista gerava um erro.

Mas eu preciso que retorno os valores de cada insumo separada por mes
GOSTEI 0
Sérgio Saibel

Sérgio Saibel

17/03/2010

Por que vc utiliza LEFT JOIN ao invéz de INNER JOIN? 
GOSTEI 0
Emerson Nascimento

Emerson Nascimento

17/03/2010

veja se assim funciona:

SQL = "SELECT " & _
      "  A.COD_INSUMO, B.ID_INSUMO, B.NOME_COMERCIAL, " & _
      "  SUM(CASE WHEN COALESCE(EXTRACT(MONTH FROM C.DATAP),0) = 1 THEN A.QUANTIDADE ELSE 0 END) AS JANEIRO, " & _
      "  SUM(CASE WHEN COALESCE(EXTRACT(MONTH FROM C.DATAP),0) = 2 THEN A.QUANTIDADE ELSE 0 END) AS FEVEREIRO, " & _
      "  SUM(CASE WHEN COALESCE(EXTRACT(MONTH FROM C.DATAP),0) = 3 THEN A.QUANTIDADE ELSE 0 END) AS MARCO, " & _
      "  SUM(CASE WHEN COALESCE(EXTRACT(MONTH FROM C.DATAP),0) = 4 THEN A.QUANTIDADE ELSE 0 END) AS ABRIL, " & _
      "  SUM(CASE WHEN COALESCE(EXTRACT(MONTH FROM C.DATAP),0) = 5 THEN A.QUANTIDADE ELSE 0 END) AS MAIO, " & _
      "  SUM(CASE WHEN COALESCE(EXTRACT(MONTH FROM C.DATAP),0) = 6 THEN A.QUANTIDADE ELSE 0 END) AS JUNHO, " & _
      "  SUM(CASE WHEN COALESCE(EXTRACT(MONTH FROM C.DATAP),0) = 7 THEN A.QUANTIDADE ELSE 0 END) AS JULHO, " & _
      "  SUM(CASE WHEN COALESCE(EXTRACT(MONTH FROM C.DATAP),0) = 8 THEN A.QUANTIDADE ELSE 0 END) AS AGOSTO, " & _
      "  SUM(CASE WHEN COALESCE(EXTRACT(MONTH FROM C.DATAP),0) = 9 THEN A.QUANTIDADE ELSE 0 END) AS SETEMBRO, " & _
      "  SUM(CASE WHEN COALESCE(EXTRACT(MONTH FROM C.DATAP),0) = 10 THEN A.QUANTIDADE ELSE 0 END) AS OUTUBRO, " & _
      "  SUM(CASE WHEN COALESCE(EXTRACT(MONTH FROM C.DATAP),0) = 11 THEN A.QUANTIDADE ELSE 0 END) AS NOVEMBRO, " & _
      "  SUM(CASE WHEN COALESCE(EXTRACT(MONTH FROM C.DATAP),0) = 12 THEN A.QUANTIDADE ELSE 0 END) AS DEZEMBRO " & _
      "FROM " & _
      "  RECEITUARIO_AGRONOMICO_INSUMO A " & _
      "LEFT JOIN " & _
      "  CAD_INSUMO B ON B.ID_INSUMO = A.COD_INSUMO " & _
      "INNER JOIN " & _
      "  RECEITUARIO_AGRONOMICO C ON C.ID_RECEITUARIO_AGRONOMICO=A.COD_RECEITUARIO_AGRONOMICO " & _
      "  AND EXTRACT(YEAR FROM C.DATAP) = " & txtAno.Text & _
      "WHERE " & _
      "  C.COD_FAZENDA = " & Identificador_fazenda & _
      " GROUP BY " & _
      "  A.COD_INSUMO, B.ID_INSUMO, B.NOME_COMERCIAL "


você usa subseletcs desnecessariamente.
elas devem ser usadas em último caso, pois oneram bastante o motor de busca do banco de dados.

GOSTEI 0
Paulo Henrique

Paulo Henrique

17/03/2010

Cara tu é fera, muito obrigado. Tava loco atras desta solução a um tempão e não conseguia. Funcionou perfeitamente.

Se não for abusar muito você poderia só me ajudar em um detalhe do outro topico?
GOSTEI 0
Emerson Nascimento

Emerson Nascimento

17/03/2010

quando o tópico for solucionado, coloque essa indicação no mesmo.
GOSTEI 0
POSTAR