none
Concatenar RRS feed

  • 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
    quarta-feira, 22 de março de 2017 19:35

Todas as Respostas

  • Manigold, boa tarde,

    Em teoria, utilizando todos os campos além do SUM no GROUP BY faria este agrupamento.

    Está ocorrendo algum erro? Duplicidade de dados?


    quarta-feira, 22 de março de 2017 19:53
  • 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
    quarta-feira, 22 de março de 2017 19:57
  • Elton inserir uma imagem de demonstração.

    obrigado.

    quarta-feira, 22 de março de 2017 20:22
  • 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.

    quarta-feira, 22 de março de 2017 20:24
  • Vou testar, muito obrigado.
    quarta-feira, 22 de março de 2017 20:30
  • 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
    quarta-feira, 22 de março de 2017 23:22
  • _Manigold_,

    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.

    quinta-feira, 23 de março de 2017 02:38