Ajuda com Select avançado

Firebird

01/06/2010

Senhores, estou com o seguinte select
SELECT ID, BX_PAGAMENTO, ESPECIE_ID, CLASSIFICACAO_ID, MOVIMENTO_ID, STATUS_ID, DESCRICAO_ID, REG_HISTORICO, CLIENTE_ID, BX_VALOR_LIQUIDO, CASE
WHEN (CLASSIFICACAO_ID NOT IN (7,16)) AND DESCRICAO_ID=2 THEN '1'
WHEN CLASSIFICACAO_ID=7 THEN '2'
WHEN (CLASSIFICACAO_ID NOT IN (7,16)) AND DESCRICAO_ID=1 THEN '3'
WHEN CLASSIFICACAO_ID=16 AND DESCRICAO_ID=1 AND CLIENTE_ID IN (SELECT ID FROM CLIFOR WHERE MODALIDADE='C') THEN '3'
END AS MOVIMENTO
from FINANCEIRO
where STATUS_ID<>0 AND BX_VALOR_LIQUIDO<>0 and BX_PAGAMENTO>=:INICIO AND BX_PAGAMENTO<=:FIM
ORDER BY BX_PAGAMENTO DESC

Gostaria de dar um GROUP BY MOVIMENTO, sendo que movimento não faz parte da minha tabela e sim a associação do resultado case.
Alguém pode dar uma luz?
Rodrigo Pagani

Rodrigo Pagani

Curtidas 0

Respostas

Wilson Junior

Wilson Junior

01/06/2010

Coloque "GROUP BY 11", pois 11 é o índice da ordem do campo no seu SQL (o índice começa em 1).

Espero ter colaborado.
GOSTEI 0
Rodrigo Pagani

Rodrigo Pagani

01/06/2010

coloquei group by 11 e está dando o seguinte erro

SQL error code = -104
Invalid expression in the select list (not contained in either an aggregate function or the GROUP BY clause)

como resolver, sendo que eu quero o group by somente com o indice 11?
GOSTEI 0
Rodrigo Pagani

Rodrigo Pagani

01/06/2010

Estou tentando fazer a soma de um campo e usar o group by, mas mesmo assim dá erro
Select CASE
            WHEN (CLASSIFICACAO_ID NOT IN (7,16)) AND DESCRICAO_ID=2 THEN '1'
            WHEN CLASSIFICACAO_ID=7 THEN '2'
            WHEN ((CLASSIFICACAO_ID NOT IN (7,16)) AND DESCRICAO_ID=1) OR (CLASSIFICACAO_ID=16 AND DESCRICAO_ID=1 AND CLIENTE_ID IN (SELECT ID FROM CLIFOR WHERE MODALIDADE='C')) THEN '3'
            END AS MOVIMENTO, SUM(BX_VALOR_LIQUIDO)
from FINANCEIRO
where STATUS_ID<>0 AND BX_VALOR_LIQUIDO<>0 AND BX_PAGAMENTO>=:INICIO AND BX_PAGAMENTO<=:FIM
GROUP BY 1

continua erro
SQL error code = -104
Invalid expression in the select list (not contained in either an aggregate function or the GROUP BY clause)
GOSTEI 0
Wilson Junior

Wilson Junior

01/06/2010

Executei no Firebird 2.1 e não retornou erro. Qual a versão do Firebird você está utilizando?
GOSTEI 0
Rodrigo Pagani

Rodrigo Pagani

01/06/2010

Estou usando a versão 1.5
Seria melhor eu mudar a versão?
GOSTEI 0
Rodrigo Pagani

Rodrigo Pagani

01/06/2010

Mudei para versão 2.1 e executei o seguinte select
Select CASE
            WHEN (CLASSIFICACAO_ID NOT IN (7,16)) AND DESCRICAO_ID=2 THEN '1'
            WHEN CLASSIFICACAO_ID=7 THEN '2'
            WHEN ((CLASSIFICACAO_ID NOT IN (7,16)) AND DESCRICAO_ID=1) OR (CLASSIFICACAO_ID=16 AND DESCRICAO_ID=1 AND CLIENTE_ID IN (SELECT ID FROM CLIFOR WHERE MODALIDADE='C')) THEN '3'
            END AS MOVIMENTO, SUM(BX_VALOR_LIQUIDO)
from FINANCEIRO
where STATUS_ID<>0 AND BX_VALOR_LIQUIDO<>0 AND BX_PAGAMENTO>='5/25/2010' AND BX_PAGAMENTO<='5/31/2010'
GROUP BY 1

Deu erro
SQL error code = -104
Invalid expression in the select list (not contained in either an aggregate function or the GROUP BY clause)

Então fiz o seguinte select mudando o group by
Select CASE
            WHEN (CLASSIFICACAO_ID NOT IN (7,16)) AND DESCRICAO_ID=2 THEN '1'
            WHEN CLASSIFICACAO_ID=7 THEN '2'
            WHEN ((CLASSIFICACAO_ID NOT IN (7,16)) AND DESCRICAO_ID=1) OR (CLASSIFICACAO_ID=16 AND DESCRICAO_ID=1 AND CLIENTE_ID IN (SELECT ID FROM CLIFOR WHERE MODALIDADE='C')) THEN '3'
            END AS MOVIMENTO, SUM(BX_VALOR_LIQUIDO)
from FINANCEIRO
where STATUS_ID<>0 AND BX_VALOR_LIQUIDO<>0 AND BX_PAGAMENTO>='5/25/2010' AND BX_PAGAMENTO<='5/31/2010'
GROUP BY 1, CLASSIFICACAO_ID, DESCRICAO_ID, CLIENTE_ID
 e me retornou o seguinte

Mas eu preciso do resultado
Movimento 1=446349,27
Movimento 2=3500,00
Movimento 3=1516,80
GOSTEI 0
Wilson Junior

Wilson Junior

01/06/2010

Teste assim:
SELECT
  CASE
    WHEN (CLASSIFICACAO_ID NOT IN (7,16)) AND DESCRICAO_ID = 2 THEN '1'
    WHEN CLASSIFICACAO_ID = 7 THEN '2'
    WHEN ((CLASSIFICACAO_ID NOT IN (7,16)) AND DESCRICAO_ID = 1) OR (CLASSIFICACAO_ID = 16 AND DESCRICAO_ID = 1 AND CLIENTE_ID IN (SELECT ID FROM CLIFOR WHERE MODALIDADE = 'C')) THEN '3'
    ELSE '0'
  END AS Movimento,
  SUM(CASE
    WHEN (CLASSIFICACAO_ID NOT IN (7,16)) AND DESCRICAO_ID = 2 THEN BX_VALOR_LIQUIDO
    WHEN CLASSIFICACAO_ID = 7 THEN BX_VALOR_LIQUIDO
    WHEN ((CLASSIFICACAO_ID NOT IN (7,16)) AND DESCRICAO_ID = 1) OR (CLASSIFICACAO_ID = 16 AND DESCRICAO_ID = 1 AND CLIENTE_ID IN (SELECT ID FROM CLIFOR WHERE MODALIDADE = 'C')) THEN BX_VALOR_LIQUIDO
    ELSE BX_VALOR_LIQUIDO
  END) AS Valor
FROM
  FINANCEIRO
WHERE
  STATUS_ID <> 0
  AND BX_VALOR_LIQUIDO <> 0
  AND BX_PAGAMENTO >= '5/25/2010'
  AND BX_PAGAMENTO <= '5/31/2010'
GROUP BY
  1


Espero ter colaborado.
GOSTEI 0
Emerson Nascimento

Emerson Nascimento

01/06/2010

tente assim:

select
  CASE
    WHEN (F.CLASSIFICACAO_ID NOT IN (7,16)) AND F.DESCRICAO_ID=2 THEN '1'
    WHEN F.CLASSIFICACAO_ID=7 THEN '2'
    WHEN ((F.CLASSIFICACAO_ID NOT IN (7,16)) AND F.DESCRICAO_ID=1) OR
         (F.CLASSIFICACAO_ID=16 AND F.DESCRICAO_ID=1 AND CF.MODALIDADE = 'C') THEN '3'
  END AS MOVIMENTO,
  SUM(F.BX_VALOR_LIQUIDO)
from
  FINANCEIRO F
left join
  CLIFOR CF on CF.ID = F.CLIENTE_ID
where
  F.STATUS_ID<>0 AND F.BX_VALOR_LIQUIDO<>0
  AND F.BX_PAGAMENTO>='5/25/2010' AND F.BX_PAGAMENTO<='5/31/2010'
group by
  1, F.CLASSIFICACAO_ID, F.DESCRICAO_ID


GOSTEI 0
Rodrigo Pagani

Rodrigo Pagani

01/06/2010

Continua dando o erro
Invalid expression in the select list (not contained in either an aggregate function or the GROUP BY clause)
Só passa se eu colocar
group by 1, CLASSIFICACAO_ID, DESCRICAO_ID, CLIENTE_ID

Mas dai o resultado dá o mesmo que eu postei a imagem

Utilizando subselect tem como de resolver isso?

GOSTEI 0
Rodrigo Pagani

Rodrigo Pagani

01/06/2010

Com esse que você passou agora
select
  CASE
    WHEN (F.CLASSIFICACAO_ID NOT IN (7,16)) AND F.DESCRICAO_ID=2 THEN '1'
    WHEN F.CLASSIFICACAO_ID=7 THEN '2'
    WHEN ((F.CLASSIFICACAO_ID NOT IN (7,16)) AND F.DESCRICAO_ID=1) OR
         (F.CLASSIFICACAO_ID=16 AND F.DESCRICAO_ID=1 AND CF.MODALIDADE = 'C') THEN '3'
  END AS MOVIMENTO,
  SUM(F.BX_VALOR_LIQUIDO)
from
  FINANCEIRO F
left join
  CLIFOR CF on CF.ID = F.CLIENTE_ID
where
  F.STATUS_ID<>0 AND F.BX_VALOR_LIQUIDO<>0
  AND F.BX_PAGAMENTO>='5/25/2010' AND F.BX_PAGAMENTO<='5/31/2010'
group by
  1, F.CLASSIFICACAO_ID, F.DESCRICAO_ID

Deu certo group by 1

Obrigado pela ajuda, esse select é para um relatório, vou finalizar o relatório para ver se deu tudo certo
Mais uma vez Obrigado
GOSTEI 0
Wilson Junior

Wilson Junior

01/06/2010

SELECT
  Movimento,
  SUM(Valor) AS ValorSoma
FROM
  (SELECT
    CASE
      WHEN (CLASSIFICACAO_ID NOT IN (7,16)) AND DESCRICAO_ID = 2 THEN '1'
      WHEN CLASSIFICACAO_ID = 7 THEN '2'
      WHEN ((CLASSIFICACAO_ID NOT IN (7,16)) AND DESCRICAO_ID = 1) OR (CLASSIFICACAO_ID = 16 AND DESCRICAO_ID = 1 AND CLIENTE_ID IN (SELECT ID FROM CLIFOR WHERE MODALIDADE = 'C')) THEN '3'
      ELSE '0'
    END AS Movimento,
    BX_VALOR_LIQUIDO AS Valor
  FROM
    FINANCEIRO
  WHERE
    STATUS_ID <> 0
    AND BX_VALOR_LIQUIDO <> 0
    AND BX_PAGAMENTO >= '5/25/2010'
    AND BX_PAGAMENTO <= '5/31/2010')
GROUP BY
  1


Espero ter colaborado.
GOSTEI 0
Rodrigo Pagani

Rodrigo Pagani

01/06/2010

Olá Wilson,
Estou fazendo um novo select para outro relatorio
SELECT DATA, SUM(ENTRADA) AS ENTRADA
FROM (SELECT BX_PAGAMENTO AS DATA,
        CASE WHEN (REG_DELETED=0 AND STATUS_ID<>0 AND MOVIMENTO_ID=2 AND DESCRICAO_ID=1) THEN BX_VALOR_LIQUIDO ELSE 0 END AS ENTRADA,
        CASE WHEN (REG_DELETED=0 AND STATUS_ID<>0 AND MOVIMENTO_ID=2 AND DESCRICAO_ID=2) THEN BX_VALOR_LIQUIDO ELSE 0 END AS SAIDA,
        MOVIMENTO_ID AS MOVIMENTO
      FROM
        FINANCEIRO)
WHERE MOVIMENTO=2
GROUP BY DATA

o resultado ele me traz
Data                     Entrada
24/05/2010          1298,53
25/05/2010              66,00

assim vai

Mas eu preciso do resultado assim
Data                     Entrada     Total
24/05/2010          1298,53    1298,53
25/05/2010              66,00    1364,53  

Preciso do campo Total e ele vai somando o total que eu tenho
Você pode me dar mai essa ajuda?
GOSTEI 0
Emerson Nascimento

Emerson Nascimento

01/06/2010

porque a subselect? não dá pra ser somente:

SELECT
   BX_PAGAMENTO AS DATA,
   CASE WHEN DESCRICAO_ID=1 THEN BX_VALOR_LIQUIDO ELSE 0 END AS ENTRADA,
   CASE WHEN DESCRICAO_ID=2 THEN BX_VALOR_LIQUIDO ELSE 0 END AS SAIDA
FROM
   FINANCEIRO
WHERE
   REG_DELETED = 0 AND STATUS_ID <> 0 AND MOVIMENTO_ID = 2
GROUP BY
   BX_PAGAMENTO
GOSTEI 0
Rodrigo Pagani

Rodrigo Pagani

01/06/2010

Assim ele da erro no group by
GOSTEI 0
Eduardo

Eduardo

01/06/2010

Você tem usar os outros campos no Group By também e Order By também Tenta aí
GOSTEI 0
Rodrigo Pagani

Rodrigo Pagani

01/06/2010

Como eu faço para pegar o valor do registro anterior para coloca na soma?
GOSTEI 0
Rodrigo Pagani

Rodrigo Pagani

01/06/2010

Estou fazendo um novo select para outro relatorio
SELECT DATA, SUM(ENTRADA) AS ENTRADA
FROM (SELECT BX_PAGAMENTO AS DATA,
        CASE WHEN (REG_DELETED=0 AND STATUS_ID<>0 AND MOVIMENTO_ID=2 AND DESCRICAO_ID=1) THEN BX_VALOR_LIQUIDO ELSE 0 END AS ENTRADA,
        CASE WHEN (REG_DELETED=0 AND STATUS_ID<>0 AND MOVIMENTO_ID=2 AND DESCRICAO_ID=2) THEN BX_VALOR_LIQUIDO ELSE 0 END AS SAIDA,
        MOVIMENTO_ID AS MOVIMENTO
      FROM
        FINANCEIRO)
WHERE MOVIMENTO=2
GROUP BY DATA

o resultado ele me traz
Data                     Entrada
24/05/2010          1298,53
25/05/2010              66,00

assim vai

Mas eu preciso do resultado assim
Data                     Entrada     Total
24/05/2010          1298,53    1298,53
25/05/2010              66,00    1364,53  

Preciso do campo Total e ele vai somando o total que eu tenho
GOSTEI 0
Emerson Nascimento

Emerson Nascimento

01/06/2010

deve ser algo assim:

SELECT TAB.DATA, SUM(TAB.ENTRADA) AS ENTRADA,
  (SELECT SUM(F.BX_VALOR_LIQUIDO) FROM FINANCEIRO F
   WHERE F.REG_DELETED=0 AND F.STATUS_ID<>0
     AND F.MOVIMENTO_ID=2 AND F.DESCRICAO_ID=1
     AND F.DATA <= TAB.DATA)
FROM (SELECT BX_PAGAMENTO AS DATA,
        CASE WHEN (REG_DELETED=0 AND STATUS_ID<>0 AND MOVIMENTO_ID=2 AND DESCRICAO_ID=1) THEN BX_VALOR_LIQUIDO ELSE 0 END AS ENTRADA,
        CASE WHEN (REG_DELETED=0 AND STATUS_ID<>0 AND MOVIMENTO_ID=2 AND DESCRICAO_ID=2) THEN BX_VALOR_LIQUIDO ELSE 0 END AS SAIDA,
        MOVIMENTO_ID AS MOVIMENTO
      FROM
        FINANCEIRO) TAB
GROUP BY DATA


mas creio que a instrução:

SELECT
   F1.BX_PAGAMENTO AS DATA,
   (CASE WHEN F1.DESCRICAO_ID=1 THEN F1.BX_VALOR_LIQUIDO ELSE 0 END) AS ENTRADA,
   (CASE WHEN F1.DESCRICAO_ID=2 THEN F1.BX_VALOR_LIQUIDO ELSE 0 END) AS SAIDA,

   (SELECT SUM(F.BX_VALOR_LIQUIDO) FROM FINANCEIRO F
    WHERE F.REG_DELETED = 0 AND F.STATUS_ID <> 0
      AND F.MOVIMENTO_ID = 2 AND F.DESCRICAO_ID = 1
      AND F.DATA <= F1.DATA) TOTAL_ENTRADA

   (SELECT SUM(F.BX_VALOR_LIQUIDO) FROM FINANCEIRO F
    WHERE F.REG_DELETED = 0 AND F.STATUS_ID <> 0
      AND F.MOVIMENTO_ID = 2 AND F.DESCRICAO_ID = 2
      AND F.DATA <= F1.DATA) TOTAL_SAIDA

FROM
   FINANCEIRO F1
WHERE
   F1.REG_DELETED = 0 AND F1.STATUS_ID <> 0 AND F1.MOVIMENTO_ID = 2
GROUP BY
   F1.BX_PAGAMENTO


funcione sem problema.


GOSTEI 0
Rodrigo Pagani

Rodrigo Pagani

01/06/2010

Senhores, muito obrigado pelas respostas, pois meu problema foi solucionado. Agora a dúvida é como eu coloco este post como concluído?
GOSTEI 0
Carlos Mazzi

Carlos Mazzi

01/06/2010

Vou ver pra fechar pra vc. abracos++
GOSTEI 0
POSTAR