|
ActiveDelphi .: O site do programador Delphi! :.
|
Exibir mensagem anterior :: Exibir próxima mensagem |
Autor |
Mensagem |
adriano_servitec Colaborador
Registrado: Sexta-Feira, 30 de Janeiro de 2004 Mensagens: 17618
|
|
Voltar ao Topo |
|
|
adriano_servitec Colaborador
Registrado: Sexta-Feira, 30 de Janeiro de 2004 Mensagens: 17618
|
|
Voltar ao Topo |
|
|
adriano_servitec Colaborador
Registrado: Sexta-Feira, 30 de Janeiro de 2004 Mensagens: 17618
|
Enviada: Sex Jan 27, 2017 2:25 pm Assunto: |
|
|
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 |
|
|
imex Moderador
Registrado: Sexta-Feira, 7 de Janeiro de 2011 Mensagens: 11666
|
Enviada: Sex Jan 27, 2017 2:43 pm Assunto: |
|
|
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 |
|
|
adriano_servitec Colaborador
Registrado: Sexta-Feira, 30 de Janeiro de 2004 Mensagens: 17618
|
|
Voltar ao Topo |
|
|
adriano_servitec Colaborador
Registrado: Sexta-Feira, 30 de Janeiro de 2004 Mensagens: 17618
|
|
Voltar ao Topo |
|
|
imex Moderador
Registrado: Sexta-Feira, 7 de Janeiro de 2011 Mensagens: 11666
|
Enviada: Qua Fev 01, 2017 1:13 pm Assunto: |
|
|
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 |
|
|
adriano_servitec Colaborador
Registrado: Sexta-Feira, 30 de Janeiro de 2004 Mensagens: 17618
|
|
Voltar ao Topo |
|
|
adriano_servitec Colaborador
Registrado: Sexta-Feira, 30 de Janeiro de 2004 Mensagens: 17618
|
Enviada: Qua Fev 01, 2017 2:41 pm Assunto: |
|
|
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 |
|
|
imex Moderador
Registrado: Sexta-Feira, 7 de Janeiro de 2011 Mensagens: 11666
|
Enviada: Qua Fev 01, 2017 3:36 pm Assunto: |
|
|
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 |
|
|
adriano_servitec Colaborador
Registrado: Sexta-Feira, 30 de Janeiro de 2004 Mensagens: 17618
|
Enviada: Qua Fev 01, 2017 4:06 pm Assunto: |
|
|
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 |
|
|
adriano_servitec Colaborador
Registrado: Sexta-Feira, 30 de Janeiro de 2004 Mensagens: 17618
|
Enviada: Qua Fev 22, 2017 10:57 am Assunto: |
|
|
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 |
|
|
imex Moderador
Registrado: Sexta-Feira, 7 de Janeiro de 2011 Mensagens: 11666
|
Enviada: Qua Fev 22, 2017 11:55 am Assunto: |
|
|
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 |
|
|
adriano_servitec Colaborador
Registrado: Sexta-Feira, 30 de Janeiro de 2004 Mensagens: 17618
|
Enviada: Qua Fev 22, 2017 1:11 pm Assunto: |
|
|
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 |
|
|
adriano_servitec Colaborador
Registrado: Sexta-Feira, 30 de Janeiro de 2004 Mensagens: 17618
|
Enviada: Qua Fev 22, 2017 1:13 pm Assunto: |
|
|
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 |
|
|
|
|
Enviar Mensagens Novas: Proibido. Responder Tópicos Proibido Editar Mensagens: Proibido. Excluir Mensagens: Proibido. Votar em Enquetes: Proibido.
|
|