Inquiridor
Concatenar

Pergunta
-
Boa tarde por gentileza gostaria de agrupar a query abaixo, mas estou tendo dificuldades devido ao campo forma de pagamento nao permitir, seria possivel a concatenacao ou alguma outra forma de agrupar os valores, obrigado:
select C.nome,A.codigo,A.data_comanda,D.servico,E.item,B.valor,B.desconto,
L.apelido,M.porcentagem_profissional,porcentagem_ajudante,
sum(H.valor_dinheiro + H.valor_cheque + valor_credito + valor_debito + H.valor_credito_debitado + H.valor_pendencia)total,E.custo,E.custo_porcentagem,
Case when H.codigo_cartao_credito > 0 or H.codigo_cartao_debito > 0 then 'Cartão'
when H.valor_dinheiro > 0 then 'Dinheiro'
when H.valor_credito_debitado > 0 then 'Crédito debitado'
when H.valor_cheque > 0 then 'Cheque'
when H.valor_cortesia > 0 then 'Cortesia'
when H.valor_pendencia > 0 then 'Pendência'
else
'Pgto não identificado'
end
FormaPagamento
from tbl_comandaaberta A
left join tbl_ComandaServico B
on A.codigo = B.codigo_comanda_aberta
left join tbl_Clientes C
on A.codigo_cliente = C.Codigo
left join tbl_servico D
on B.codigo_servico = D.codigo
left join tbl_Item E
on B.codigo_item = E.codigo
left join tbl_Faturamento H
on A.codigo = H.codigo_comanda
left join tbl_BandeiraCartao I
on H.codigo_cartao_debito = I.codigo
left join tbl_BandeiraCartao J
on H.codigo_cartao_credito = J.codigo
left join tbl_Funcionario L
on B.codigo_profissional = L.codigo
-- comissao ---
left join tbl_comissao M
on B.codigo_servico = M.codigo_servico
and B.codigo_profissional = M.codigo_funcionario
left join tbl_aberturacaixa N
on A.codigo_abertura_caixa = N.codigo
where A.codigo_empresa = 1
and B.valor > 0
and convert(date,N.data) between '2017-03-19' and '2017-03-20'
and L.codigo = 30081
and A.codigo = 51168
group by
C.nome,A.codigo,A.data_comanda,D.servico,E.item,B.valor,B.desconto,
L.apelido,M.porcentagem_profissional,porcentagem_ajudante,E.custo,E.custo_porcentagem,
Case when H.codigo_cartao_credito > 0 or H.codigo_cartao_debito > 0 then 'Cartão'
when H.valor_dinheiro > 0 then 'Dinheiro'
when H.valor_credito_debitado > 0 then 'Crédito debitado'
when H.valor_cheque > 0 then 'Cheque'
when H.valor_cortesia > 0 then 'Cortesia'
when H.valor_pendencia > 0 then 'Pendência'
else
'Pgto não identificado'
end- Editado _Manigold_ quarta-feira, 22 de março de 2017 20:22
Todas as Respostas
-
-
Olá Elton, tudo bem? na verdade ele não agrupa devido ter por exemplo 2 formas de pagamento para o mesmo produto.
Muito obrigado.
- Editado _Manigold_ quarta-feira, 22 de março de 2017 20:21
-
-
Entendi.
Neste caso eu te sugeriria fazer o seguinte:
Remove o campo forma de pagamento, escreve um sub-select concatenando os tipos de pagamento.
Pra concatenar, eu te sugiro utilizar o FOR XML PATH, e traz este campo concatenado como uma coluna do SELECT principal.
Exemplo:
SELECT PRD.NomeProduto, VEN.DataVenda, STUFF(TAB.FormaPagamentoConcatenada, 1, 1, '') FormaPagamentoConcatenada, SUM(VEN.ValorPago) Total FROM Venda VEN INNER JOIN Cliente CLI ON CLI.CodigoCliente = VEN.CodigoCliente INNER JOIN Produto PRD ON VEN.CodigoProduto = PRD.CodigoProduto OUTER APPLY ( SELECT ( SELECT FPA.FormaPagamento + ', ' FROM Venda VEN2 INNER JOIN FormasPagamento FPA ON FPA.CodigoVenda = VEN2.CodigoVenda WHERE VEN.CodigoFormaPagamento = FPA.CodigoFormaPagamento FOR XML PATH ('') ) AS FormaPagamentoConcatenada ) TAB GROUP BY PRD.NomeProduto, VEN.DataVenda, STUFF(TAB.FormaPagamentoConcatenada, 1, 1, '')
Desta forma, quando houver mais de uma forma de pagamento (Cartão, Cheque), ele trará em uma coluna só, concatenado, e vai somar o valor das vendas do mesmo produto.
Fiz somente um esboço com tabelas mais simples.
Espero ter ajudado.
Abraço.
-
-
Olá Elton tudo bem? tentei fazer mais infelizmente não obtive sucesso:
select C.nome,A.codigo,A.data_comanda,D.servico,E.item,B.valor,B.desconto,
L.apelido,M.porcentagem_profissional,porcentagem_ajudante,
E.custo,E.custo_porcentagem,
STUFF(
Case when H.codigo_cartao_credito > 0 or H.codigo_cartao_debito > 0 then 'Cartão'
when H.valor_dinheiro > 0 then 'Dinheiro'
when H.valor_credito_debitado > 0 then 'Crédito debitado'
when H.valor_cheque > 0 then 'Cheque'
when H.valor_cortesia > 0 then 'Cortesia'
when H.valor_pendencia > 0 then 'Pendência'
else
'Pgto não identificado'
end, 1, 0, ''
)
FormaPagamento,
sum(H.valor_dinheiro + H.valor_cheque + valor_credito + valor_debito + H.valor_credito_debitado + H.valor_pendencia)total
from tbl_comandaaberta A
left join tbl_ComandaServico B
on A.codigo = B.codigo_comanda_aberta
left join tbl_Clientes C
on A.codigo_cliente = C.Codigo
left join tbl_servico D
on B.codigo_servico = D.codigo
left join tbl_Item E
on B.codigo_item = E.codigo
left join tbl_Faturamento H
on A.codigo = H.codigo_comanda
left join tbl_BandeiraCartao I
on H.codigo_cartao_debito = I.codigo
left join tbl_BandeiraCartao J
on H.codigo_cartao_credito = J.codigo
left join tbl_Funcionario L
on B.codigo_profissional = L.codigo
-- comissao ---
left join tbl_comissao M
on B.codigo_servico = M.codigo_servico
and B.codigo_profissional = M.codigo_funcionario
left join tbl_aberturacaixa N
on A.codigo_abertura_caixa = N.codigo
OUTER APPLY (
SELECT (
Case when H.codigo_cartao_credito > 0 or H.codigo_cartao_debito > 0 then 'Cartão'
when H.valor_dinheiro > 0 then 'Dinheiro'
when H.valor_credito_debitado > 0 then 'Crédito debitado'
when H.valor_cheque > 0 then 'Cheque'
when H.valor_cortesia > 0 then 'Cortesia'
when H.valor_pendencia > 0 then 'Pendência'
else
'Pgto não identificado'
end + ', '
--FOR XML PATH ('')
) AS FormaPagamento
) TAB
where A.codigo_empresa = 1
and B.valor > 0
and convert(date,N.data) between '2017-03-19' and '2017-03-20'
and L.codigo = 30081
and A.codigo = 51168
group by
C.nome,A.codigo,A.data_comanda,D.servico,E.item,B.valor,B.desconto,
L.apelido,M.porcentagem_profissional,porcentagem_ajudante,E.custo,E.custo_porcentagem,
Case when H.codigo_cartao_credito > 0 or H.codigo_cartao_debito > 0 then 'Cartão'
when H.valor_dinheiro > 0 then 'Dinheiro'
when H.valor_credito_debitado > 0 then 'Crédito debitado'
when H.valor_cheque > 0 then 'Cheque'
when H.valor_cortesia > 0 then 'Cortesia'
when H.valor_pendencia > 0 then 'Pendência'
else
'Pgto não identificado'
end,
STUFF(TAB.FormaPagamento, 1, 1, '')
Mesmo assim fica aqui meu agradecimento.
- Editado _Manigold_ quarta-feira, 22 de março de 2017 23:35
-
Tente assim:
select nome, codigo, data_comanda, servico, item, SUM(valor) valor, SUM(desconto) desconto, apelido, SUM(porcentagem_profissional) porcentagem_profissional, sum(porcentagem_ajudante) porcentagem_ajudante, sum(total) total, sum(custo) custo, sum(custo_porcentagem) custo_porcentagem, FormaPagamento from ( select C.nome,A.codigo,A.data_comanda,D.servico,E.item,B.valor,B.desconto, L.apelido,M.porcentagem_profissional,porcentagem_ajudante, sum(H.valor_dinheiro + H.valor_cheque + valor_credito + valor_debito + H.valor_credito_debitado + H.valor_pendencia)total,E.custo,E.custo_porcentagem, Case when H.codigo_cartao_credito > 0 or H.codigo_cartao_debito > 0 then 'Cartão' when H.valor_dinheiro > 0 then 'Dinheiro' when H.valor_credito_debitado > 0 then 'Crédito debitado' when H.valor_cheque > 0 then 'Cheque' when H.valor_cortesia > 0 then 'Cortesia' when H.valor_pendencia > 0 then 'Pendência' else 'Pgto não identificado' end FormaPagamento from tbl_comandaaberta A left join tbl_ComandaServico B on A.codigo = B.codigo_comanda_aberta left join tbl_Clientes C on A.codigo_cliente = C.Codigo left join tbl_servico D on B.codigo_servico = D.codigo left join tbl_Item E on B.codigo_item = E.codigo left join tbl_Faturamento H on A.codigo = H.codigo_comanda left join tbl_BandeiraCartao I on H.codigo_cartao_debito = I.codigo left join tbl_BandeiraCartao J on H.codigo_cartao_credito = J.codigo left join tbl_Funcionario L on B.codigo_profissional = L.codigo -- comissao --- left join tbl_comissao M on B.codigo_servico = M.codigo_servico and B.codigo_profissional = M.codigo_funcionario left join tbl_aberturacaixa N on A.codigo_abertura_caixa = N.codigo where A.codigo_empresa = 1 and B.valor > 0 and convert(date,N.data) between '2017-03-19' and '2017-03-20' and L.codigo = 30081 and A.codigo = 51168 ) T GROUP BY nome, codigo, data_comanda, servico, item, apelido, FormaPagamento
Só explicando, usei tua query como subselect e fiz a totalização por fora, somando os campos que são valores.
Caso algum campo não seja realmente valor ser somado, basta tirar o SUM e acrescentá-lo ao "group by".
Poderia também ser feito com CTE, mas acho que desta forma você pode entender melhor.
Antero Marques _______________________________________________________________________________ Se a resposta for útil, marque como útil, se respondeu totalmente sua dúvida, marque como resposta. O Fórum MSDN é utilizado também como base de conhecimento, então é responsabilidade de todos mantê-lo organizado e funcional.
- Sugerido como Resposta Junior Galvão - MVPMVP quinta-feira, 23 de março de 2017 23:19