ActiveDelphi - Índice do Fórum ActiveDelphi
.: O site do programador Delphi! :.
 
 FAQFAQ   PesquisarPesquisar   MembrosMembros   GruposGrupos   RegistrarRegistrar 
 PerfilPerfil   Entrar e ver Mensagens ParticularesEntrar e ver Mensagens Particulares   EntrarEntrar 

Somar um select Postgres
Ir à página Anterior  1, 2, 3, 4  Próximo
 
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Banco de Dados
Exibir mensagem anterior :: Exibir próxima mensagem  
Autor Mensagem
adriano_servitec
Colaborador
Colaborador


Registrado: Sexta-Feira, 30 de Janeiro de 2004
Mensagens: 17618

MensagemEnviada: Sex Jan 27, 2017 2:17 pm    Assunto: Responder com Citação

imex escreveu:
Acho a princípio que deveria funcionar, apesr que não costumo utilizar caractere especial nos nomes dos objetos.
Experimente fazer um teste utilizando o campo Data_Hora no Case para ver se faz alguma diferença:

Código:
 CASE WHEN Data_Hora IS NULL


Espero que ajude
Mudando assim no select com gorup by em números não funciona, ja com nome do campo fica assim


_________________
Jogo seu smartphone? Acesse o link e confira.
https://play.google.com/store/apps/details?id=br.com.couldsys.rockdrum
https://play.google.com/store/apps/details?id=br.com.couldsys.drumsetfree
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
adriano_servitec
Colaborador
Colaborador


Registrado: Sexta-Feira, 30 de Janeiro de 2004
Mensagens: 17618

MensagemEnviada: Sex Jan 27, 2017 2:22 pm    Assunto: Responder com Citação

Tanto data_hora, quanto origem_venda não muda nada da primeira imagem colocando no primeiro case a onde esta nº_ordem

Código:
CASE WHEN origem_venda IS NULL
        THEN
            CASE WHEN data_venda IS NULL
                THEN 'Total geral'
                ELSE 'Total do dia'
            END
        ELSE nome
   END AS nome,

_________________
Jogo seu smartphone? Acesse o link e confira.
https://play.google.com/store/apps/details?id=br.com.couldsys.rockdrum
https://play.google.com/store/apps/details?id=br.com.couldsys.drumsetfree
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
adriano_servitec
Colaborador
Colaborador


Registrado: Sexta-Feira, 30 de Janeiro de 2004
Mensagens: 17618

MensagemEnviada: Sex Jan 27, 2017 2:25 pm    Assunto: Responder com Citação

Assim:
Código:
 WITH CTE_SUMVENDA AS                                                         
 (  SELECT
 v.data_venda as data_venda,
 CAST(v.data_venda || ' - ' || v.hora_venda AS VARCHAR(30)) as Data_Hora,
 v.id as nº_pedido,
 v.origem_venda,
 cl.nome,
 SUM(vi.qtd) AS Quantidade,     
 SUM(vi.qtd * vi.preco_tabela) AS Preço_Bruto,
 SUM(COALESCE(v.valor_final_desconto, 0) + (vi.qtd * vi.preco_tabela) - (vi.qtd * vi.preco_venda)) AS Desconto,
 SUM(vi.preco_tabela - (COALESCE(v.valor_final_desconto, 0) + (vi.qtd * vi.preco_tabela) - (vi.qtd * vi.preco_venda))) AS Total_Liquido,
 SUM(vi.qtd * vi.valor_preco_custo) AS Custo,                             
 SUM((vi.preco_tabela - (COALESCE(v.valor_final_desconto, 0) + (vi.qtd * vi.preco_tabela) - (vi.qtd * vi.preco_venda))) - (vi.qtd * vi.valor_preco_custo)) AS Lucro,
 CAST('F' as varchar(10)) as pagamento,                 
 CAST('L' as varchar(10)) as visualizar                 
 FROM venda V                                                               
 INNER JOIN cliente cl ON v.id_cliente = cl.id                             
 INNER JOIN venda_itens vi on v.id = vi.id_venda                           
 WHERE v.situacao = 'C' AND v.data_venda BETWEEN                         
 '25/01/2017' AND '26/01/2017'
 --AND V.ID IN (485,486)
 GROUP BY 1,2,3,4,5 --data_venda, Data_Hora, nº_pedido, origem_venda, nome                                                           
 )                                                         
 SELECT
 data_venda,
 Data_Hora,
 nº_pedido,
 origem_venda,
 
 CASE WHEN origem_venda IS NULL
        THEN
            CASE WHEN data_venda IS NULL
                THEN 'Total geral'
                ELSE 'Total do dia'
            END
        ELSE nome
   END AS nome,
                         
 CAST(CAST(SUM(Quantidade) AS NUMERIC(15,0)) AS VARCHAR(30)) as Quantidade,     
 CAST(TO_CHAR(SUM(Preço_Bruto),'R$  999G999G990D99')as varchar(30)) as Preço_Bruto,     
 CAST(TO_CHAR(SUM(Desconto),'R$  999G999G990D99')as varchar(30)) as Desconto,     
 CAST(TO_CHAR(SUM(Total_Liquido),'R$  999G999G990D99')as varchar(30)) as Total_Liquido,     
 CAST(TO_CHAR(SUM(Custo),'R$  999G999G990D99')as varchar(30)) as Custo,     
 CAST(TO_CHAR(SUM(Lucro),'R$  999G999G990D99')as varchar(30)) as Lucro,     
 pagamento,
 visualizar                                                   
 FROM CTE_SUMVENDA                                                         
 GROUP BY GROUPING SETS                                                     
 ( (data_venda, Data_Hora, nº_pedido, origem_venda, nome, pagamento, visualizar ), () )
 ORDER BY data_venda, Data_Hora         


O resultado é este

_________________
Jogo seu smartphone? Acesse o link e confira.
https://play.google.com/store/apps/details?id=br.com.couldsys.rockdrum
https://play.google.com/store/apps/details?id=br.com.couldsys.drumsetfree
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
imex
Moderador
Moderador


Registrado: Sexta-Feira, 7 de Janeiro de 2011
Mensagens: 11666

MensagemEnviada: Sex Jan 27, 2017 2:43 pm    Assunto: Responder com Citação

Pelo que vi parece que no PostgreSQL pode ser utilizada a função Grouping para identificar as linhas de totais.
Experimente fazer uns testes dessa forma:

Código:
 WITH CTE_SUMVENDA AS                                                         
 (  SELECT
 v.data_venda as data_venda,
 CAST(v.data_venda || ' - ' || v.hora_venda AS VARCHAR(30)) as Data_Hora,
 v.id as nº_pedido,
 v.origem_venda,
 cl.nome,
 SUM(vi.qtd) AS Quantidade,     
 SUM(vi.qtd * vi.preco_tabela) AS Preço_Bruto,
 SUM(COALESCE(v.valor_final_desconto, 0) + (vi.qtd * vi.preco_tabela) - (vi.qtd * vi.preco_venda)) AS Desconto,
 SUM(vi.preco_tabela - (COALESCE(v.valor_final_desconto, 0) + (vi.qtd * vi.preco_tabela) - (vi.qtd * vi.preco_venda))) AS Total_Liquido,
 SUM(vi.qtd * vi.valor_preco_custo) AS Custo,                             
 SUM((vi.preco_tabela - (COALESCE(v.valor_final_desconto, 0) + (vi.qtd * vi.preco_tabela) - (vi.qtd * vi.preco_venda))) - (vi.qtd * vi.valor_preco_custo)) AS Lucro                 
 FROM venda V                                                               
 INNER JOIN cliente cl ON v.id_cliente = cl.id                             
 INNER JOIN venda_itens vi on v.id = vi.id_venda                           
 WHERE v.situacao = 'C' AND v.data_venda BETWEEN                         
 '25/01/2017' AND '26/01/2017'
 --AND V.ID IN (485,486)
 GROUP BY 1,2,3,4,5 --data_venda, Data_Hora, nº_pedido, origem_venda, nome                                                           
 )                                                         
 SELECT
 data_venda,
 Data_Hora,
 nº_pedido,
 origem_venda,
 
 CASE GROUPING(data_venda, Data_Hora, nº_pedido, origem_venda, nome)
     WHEN  1 THEN 'Total do dia'
     WHEN 31 THEN 'Total geral'
     ELSE nome
 END AS nome,
                         
 CAST(CAST(SUM(Quantidade) AS NUMERIC(15,0)) AS VARCHAR(30)) as Quantidade,     
 CAST(TO_CHAR(SUM(Preço_Bruto),'R$  999G999G990D99')as varchar(30)) as Preço_Bruto,     
 CAST(TO_CHAR(SUM(Desconto),'R$  999G999G990D99')as varchar(30)) as Desconto,     
 CAST(TO_CHAR(SUM(Total_Liquido),'R$  999G999G990D99')as varchar(30)) as Total_Liquido,     
 CAST(TO_CHAR(SUM(Custo),'R$  999G999G990D99')as varchar(30)) as Custo,     
 CAST(TO_CHAR(SUM(Lucro),'R$  999G999G990D99')as varchar(30)) as Lucro,
 CAST('F' as varchar(10)) as pagamento,                 
 CAST('L' as varchar(10)) as visualizar                                                   
 FROM CTE_SUMVENDA                                                         
 GROUP BY GROUPING SETS                                                     
 ( (data_venda, Data_Hora, nº_pedido, origem_venda, nome), (data_venda), () )
 ORDER BY data_venda, Data_Hora


obs: passei os campos pagamento e visualizar para o final, pois assim não são necessários no Group By

Espero que ajude
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
adriano_servitec
Colaborador
Colaborador


Registrado: Sexta-Feira, 30 de Janeiro de 2004
Mensagens: 17618

MensagemEnviada: Sex Jan 27, 2017 2:55 pm    Assunto: Responder com Citação

Não sei o que retorna no case do grupo
when 1 e
when 31, mais não deu certo assim Imex

Olhe


Ja fazendo assim (observe o case na imagem)

Funcionou

Agora percebi porque funcionou e antes não. Por causa disso que vc comentou
Citação:
obs: passei os campos pagamento e visualizar para o final, pois assim não são necessários no Group By


Então o problema era este o tempo todo.

Obrigado pela persistência na ajuda Imex.

Agora ficou show de bola.
_________________
Jogo seu smartphone? Acesse o link e confira.
https://play.google.com/store/apps/details?id=br.com.couldsys.rockdrum
https://play.google.com/store/apps/details?id=br.com.couldsys.drumsetfree
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
adriano_servitec
Colaborador
Colaborador


Registrado: Sexta-Feira, 30 de Janeiro de 2004
Mensagens: 17618

MensagemEnviada: Qua Fev 01, 2017 10:39 am    Assunto: Responder com Citação

Será que tem como pegar os valores do resultado que vem no TOTAL GERAL e passar para variáveis?
_________________
Jogo seu smartphone? Acesse o link e confira.
https://play.google.com/store/apps/details?id=br.com.couldsys.rockdrum
https://play.google.com/store/apps/details?id=br.com.couldsys.drumsetfree
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
imex
Moderador
Moderador


Registrado: Sexta-Feira, 7 de Janeiro de 2011
Mensagens: 11666

MensagemEnviada: Qua Fev 01, 2017 1:13 pm    Assunto: Responder com Citação

Na aplicação em Delphi? Se for acho que esse será o último registro e para acessa-lo pode ser utilizado o método Last do DataSet.

Espero que ajude
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
adriano_servitec
Colaborador
Colaborador


Registrado: Sexta-Feira, 30 de Janeiro de 2004
Mensagens: 17618

MensagemEnviada: Qua Fev 01, 2017 2:13 pm    Assunto: Responder com Citação

imex escreveu:
Na aplicação em Delphi? Se for acho que esse será o último registro e para acessa-lo pode ser utilizado o método Last do DataSet.

Espero que ajude
Isso mesmo. Valeu.
_________________
Jogo seu smartphone? Acesse o link e confira.
https://play.google.com/store/apps/details?id=br.com.couldsys.rockdrum
https://play.google.com/store/apps/details?id=br.com.couldsys.drumsetfree
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
adriano_servitec
Colaborador
Colaborador


Registrado: Sexta-Feira, 30 de Janeiro de 2004
Mensagens: 17618

MensagemEnviada: Qua Fev 01, 2017 2:41 pm    Assunto: Responder com Citação

Outra duvida
O DataSet.RecNo deste select ai me traz o resultado + Total dia e Total geral

Por exemplo se eu tenho 5 registros de retorno de uma data unica junto com o Total do dia e o Total geral meu recno é de 7 registro, tem como mostrar numa variavel apenas os 5 registros?

Não posso simplesmente fazer assim
Código:
lblTotalPedidosVR.Caption :=
    IntToStr(grdVendasRealizadas.DataSource.DataSet.RecordCount - 2);

Porque não são somente um Total dia que vem, pode vir varios numa consulta
_________________
Jogo seu smartphone? Acesse o link e confira.
https://play.google.com/store/apps/details?id=br.com.couldsys.rockdrum
https://play.google.com/store/apps/details?id=br.com.couldsys.drumsetfree
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
imex
Moderador
Moderador


Registrado: Sexta-Feira, 7 de Janeiro de 2011
Mensagens: 11666

MensagemEnviada: Qua Fev 01, 2017 3:36 pm    Assunto: Responder com Citação

Experimente fazer uns testes acrescentando o trecho abaixo na parte final da query:

Código:
 count(distinct data_venda) as Qtd_Dias,


Não sei se vai funcionar, mas veja se esse campo retorna na linha do "Total geral" a quantidade de dias diferentes presentes no resultado. Se retornar você pode pegar essa quantidade (que é igual a quantidade de registros do tipo "Total dia") para utilizar na subtração.

Espero que ajude
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
adriano_servitec
Colaborador
Colaborador


Registrado: Sexta-Feira, 30 de Janeiro de 2004
Mensagens: 17618

MensagemEnviada: Qua Fev 01, 2017 4:06 pm    Assunto: Responder com Citação

imex escreveu:
Experimente fazer uns testes acrescentando o trecho abaixo na parte final da query:

Código:
 count(distinct data_venda) as Qtd_Dias,


Não sei se vai funcionar, mas veja se esse campo retorna na linha do "Total geral" a quantidade de dias diferentes presentes no resultado. Se retornar você pode pegar essa quantidade (que é igual a quantidade de registros do tipo "Total dia") para utilizar na subtração.

Espero que ajude
Parece que funcionou.
Fiz alguns testes e esta ok.

Obrigado Imex
_________________
Jogo seu smartphone? Acesse o link e confira.
https://play.google.com/store/apps/details?id=br.com.couldsys.rockdrum
https://play.google.com/store/apps/details?id=br.com.couldsys.drumsetfree
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
adriano_servitec
Colaborador
Colaborador


Registrado: Sexta-Feira, 30 de Janeiro de 2004
Mensagens: 17618

MensagemEnviada: Qua Fev 22, 2017 10:57 am    Assunto: Responder com Citação

Como faço para agrupar por numero de caixa e somar em baixo deles e no final um sum geral?

Assim não rolou
Código:
WITH CTE_SANGRIA AS                                                         
 (
SELECT
   vic.num_caixa as id_caixa,
   vs.data_hora,
   wu.nome_usuario,
   'Caixa nº ' || vic.num_caixa as numero_caixa,
   vic.vlr_inicial,   
   vs.valor as valor_sangria,
   vs.obs as observacao_motivo       
FROM valor_sangria vs
LEFT JOIN webc_usuario wu on wu.id = vs.usuario_id
LEFT JOIN valor_inicial_caixa vic on vic.id = vs.valor_inicial_caixa_id
--WHERE vs.data_hora BETWEEN :pDATAINI AS :pDATAFIN
)
select
   id_caixa,
   data_hora,
   nome_usuario,
   case when data_hora is null
        then
            case when id_caixa is null
                then 'Total geral'
                else 'Total do caixa'
            end
        else numero_caixa
    end as numero_caixa,
    vlr_inicial,
    sum(valor_sangria) as valor_sangria,
    observacao_motivo
from CTE_SANGRIA
group by grouping sets
    ((id_caixa, data_hora, nome_usuario, numero_caixa, vlr_inicial, observacao_motivo), (id_caixa))
 ORDER BY data_hora, numero_caixa   




_________________
Jogo seu smartphone? Acesse o link e confira.
https://play.google.com/store/apps/details?id=br.com.couldsys.rockdrum
https://play.google.com/store/apps/details?id=br.com.couldsys.drumsetfree
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
imex
Moderador
Moderador


Registrado: Sexta-Feira, 7 de Janeiro de 2011
Mensagens: 11666

MensagemEnviada: Qua Fev 22, 2017 11:55 am    Assunto: Responder com Citação

Experimente dessa forma:

Código:
group by grouping sets
    ((id_caixa, data_hora, nome_usuario, numero_caixa, vlr_inicial, observacao_motivo), (id_caixa), ())
 ORDER BY numero_caixa, data_hora


Espero que ajude
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
adriano_servitec
Colaborador
Colaborador


Registrado: Sexta-Feira, 30 de Janeiro de 2004
Mensagens: 17618

MensagemEnviada: Qua Fev 22, 2017 1:11 pm    Assunto: Responder com Citação

Assim
Código:
WITH CTE_SANGRIA AS                                                         
 (
SELECT
   vic.num_caixa as id_caixa,
   vs.data_hora,
   wu.nome_usuario,
   'Caixa nº ' || vic.num_caixa as numero_caixa,
   vic.vlr_inicial,   
   vs.valor as valor_sangria,
   vs.obs as observacao_motivo       
FROM valor_sangria vs
LEFT JOIN webc_usuario wu on wu.id = vs.usuario_id
LEFT JOIN valor_inicial_caixa vic on vic.id = vs.valor_inicial_caixa_id
--WHERE vs.data_hora BETWEEN :pDATAINI AS :pDATAFIN
)
select
   id_caixa,
   data_hora,
   nome_usuario,
   case when data_hora is null
        then
            case when id_caixa is null
                then 'Total geral'
                else 'Total do caixa'
            end
        else numero_caixa
    end as numero_caixa,
    vlr_inicial,
    sum(valor_sangria) as valor_sangria,
    observacao_motivo
from CTE_SANGRIA
group by grouping sets
    ((id_caixa, data_hora, nome_usuario, numero_caixa, vlr_inicial, observacao_motivo), (id_caixa), ())
 ORDER BY numero_caixa, data_hora


O resultado fica assim


Preciso que fique separado embaixo de cada um Caixa 1 e Caixa 2
_________________
Jogo seu smartphone? Acesse o link e confira.
https://play.google.com/store/apps/details?id=br.com.couldsys.rockdrum
https://play.google.com/store/apps/details?id=br.com.couldsys.drumsetfree
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
adriano_servitec
Colaborador
Colaborador


Registrado: Sexta-Feira, 30 de Janeiro de 2004
Mensagens: 17618

MensagemEnviada: Qua Fev 22, 2017 1:13 pm    Assunto: Responder com Citação

Acertei aqui Imex
Código:
WITH CTE_SANGRIA AS                                                         
 (
SELECT
   vic.num_caixa as id_caixa,
   vs.data_hora,
   wu.nome_usuario,
   'Caixa nº ' || vic.num_caixa as numero_caixa,
   vic.vlr_inicial,   
   vs.valor as valor_sangria,
   vs.obs as observacao_motivo       
FROM valor_sangria vs
LEFT JOIN webc_usuario wu on wu.id = vs.usuario_id
LEFT JOIN valor_inicial_caixa vic on vic.id = vs.valor_inicial_caixa_id
--WHERE vs.data_hora BETWEEN :pDATAINI AS :pDATAFIN
)
select
   id_caixa,
   data_hora,
   nome_usuario,
   case when data_hora is null
        then
            case when id_caixa is null
                then 'Total geral'
                else 'Total do caixa'
            end
        else numero_caixa
    end as numero_caixa,
    vlr_inicial,
    sum(valor_sangria) as valor_sangria,
    observacao_motivo
from CTE_SANGRIA
group by grouping sets
    ((id_caixa, data_hora, nome_usuario, numero_caixa, vlr_inicial, observacao_motivo), (id_caixa), ())
 ORDER BY id_caixa, numero_caixa, data_hora


Obrigado
_________________
Jogo seu smartphone? Acesse o link e confira.
https://play.google.com/store/apps/details?id=br.com.couldsys.rockdrum
https://play.google.com/store/apps/details?id=br.com.couldsys.drumsetfree
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
Mostrar os tópicos anteriores:   
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Banco de Dados Todos os horários são GMT - 3 Horas
Ir à página Anterior  1, 2, 3, 4  Próximo
Página 3 de 4

 
Ir para:  
Enviar Mensagens Novas: Proibido.
Responder Tópicos Proibido
Editar Mensagens: Proibido.
Excluir Mensagens: Proibido.
Votar em Enquetes: Proibido.


Powered by phpBB © 2001, 2005 phpBB Group
Traduzido por: Suporte phpBB