GARANTIR DESCONTO

Fórum Ajuda com Select avançado #378708

01/06/2010

0

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

Responder

Posts

02/06/2010

Wilson Junior

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

Espero ter colaborado.
Responder

Gostei + 0

02/06/2010

Rodrigo Pagani

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?
Responder

Gostei + 0

02/06/2010

Rodrigo Pagani

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)
Responder

Gostei + 0

02/06/2010

Wilson Junior

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

Gostei + 0

02/06/2010

Rodrigo Pagani

Estou usando a versão 1.5
Seria melhor eu mudar a versão?
Responder

Gostei + 0

02/06/2010

Rodrigo Pagani

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
Responder

Gostei + 0

02/06/2010

Wilson Junior

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.
Responder

Gostei + 0

02/06/2010

Emerson Nascimento

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


Responder

Gostei + 0

02/06/2010

Rodrigo Pagani

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?

Responder

Gostei + 0

02/06/2010

Rodrigo Pagani

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
Responder

Gostei + 0

02/06/2010

Wilson Junior

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.
Responder

Gostei + 0

03/06/2010

Rodrigo Pagani

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?
Responder

Gostei + 0

04/06/2010

Emerson Nascimento

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
Responder

Gostei + 0

04/06/2010

Rodrigo Pagani

Assim ele da erro no group by
Responder

Gostei + 0

05/06/2010

Eduardo

Você tem usar os outros campos no Group By também e Order By também Tenta aí
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar