none
Como faço esta query sem PIVOT RRS feed

  • Pergunta

  •  

    select isnull(pedido_registro,'Total') as 'Data Pedido',

    sum([1]) as 'Cartão de Crédito',sum([14]) as 'Doação' ,sum([1]+ [14]) as Total

    from

    (select Convert(nvarchar (15),pedido_data,105)as

    pedido_registro,p.pedido_id,pm.forma_pagamento_id from pedidos p

    inner join pedidosmeios pm (nolock) on p.pedido_id = pm.pedido_id

    where entidade_id = @ent_id and p.pedido_status_id = 44 and pedido_registro

    between @data_inicial and @data_final) T PIVOT ( count(pedido_id)FOR forma_pagamento_id

    IN ([1], [14])) AS a

    group by pedido_registro with rollup

     

    Tenho uma campo que armazena dois valores em alguns registros é o 14 e em outros é o 1, gostaria de criar uma coluna para o 14 e outra para o 1 somando quantas vezes o valor repete em função de um grupo como na query acima porém não posso usar o PIVOT pois estou usando uma Dataset tipado.

    terça-feira, 26 de agosto de 2008 13:45

Respostas

  • Obrigado pessoal, consegui usando case.

     

     

    Code Snippet
    SELECT   convert(nvarchar (15),p.PEDIDO_REGISTRO,105) as Data_Pedido, 
    Cartao = count(CASE WHEN pm.forma_pagamento_id = 1 THEN p.PEDIDO_ID end),
    Doacao = count(CASE WHEN pm.forma_pagamento_id = 14 THEN p.PEDIDO_ID end),
    Total= (count(CASE WHEN pm.forma_pagamento_id = 1 THEN p.PEDIDO_ID end) + count(CASE WHEN pm.forma_pagamento_id = 14 THEN p.PEDIDO_ID end))
    FROM        
    PEDIDOS p INNER JOIN PedidosMeios pm  (nolock) ON p.PEDIDO_ID = pm.PEDIDO_ID
    WHERE (p.ENTIDADE_ID = @ent_id) AND (p.PEDIDO_STATUS_ID = 44) AND (p.PEDIDO_REGISTRO BETWEEN @data_inicial AND @data_final)
    GROUP BY convert(nvarchar (15),p.PEDIDO_REGISTRO,105) with rollup

     

     

     

    sexta-feira, 29 de agosto de 2008 20:15

Todas as Respostas

  • NNelson,

     

    Qual é a versão do SQL Server que você esta utilizando?

    terça-feira, 26 de agosto de 2008 13:52
  • Olá Nelson,

     

    Fiquei confuso com sua consulta e não sei bem como reescrevê-la (detalhar a necessidade às vezes é mais fácil de entender do que o código). De qualquer forma, se o PIVOT não o atende, experimente o uso de Subqueries (Derived Table). Ex:

     

    Code Snippet

    SELECT ID, Campo

    (SELECT SUM(Valor) FROM tb2 WHERE tb1.ID = tb2.ID AND Categoria = 14) AS Credito,

    (SELECT SUM(Valor) FROM tb2 WHERE tb1.ID = tb2.ID AND Categoria = 1) AS Doacao

    FROM

    tb1

     

     

    [ ]s,

     

    Gustavo

     

    terça-feira, 26 de agosto de 2008 13:53
  • 2005

     

    terça-feira, 26 de agosto de 2008 14:10
  • Boa Tarde,

     

    Se você colocar o SELECT em um View ou SP você não contorna a limitação do DataSet tipado ?

     

    [ ]s,

     

    Gustavo

    terça-feira, 26 de agosto de 2008 16:45
  • Maia,

     

    Mas o seria estaria trazendo os dados tipados, já definidos para o DataSet!!!

     

    terça-feira, 26 de agosto de 2008 16:53
  • Oi Jr.

     

    Não sei o porque DataSet tipados não podem utilizar esse tipo de SELECT. Como View também gravam dados em tabelas de metadados, imagino que o DataSet irá ler os tipos de dados retornados pela View e nesse caso essa limitação estará superada.

     

    [ ]s,

     

    Gustavo

     

    terça-feira, 26 de agosto de 2008 17:14
  • Obrigado pessoal, consegui usando case.

     

     

    Code Snippet
    SELECT   convert(nvarchar (15),p.PEDIDO_REGISTRO,105) as Data_Pedido, 
    Cartao = count(CASE WHEN pm.forma_pagamento_id = 1 THEN p.PEDIDO_ID end),
    Doacao = count(CASE WHEN pm.forma_pagamento_id = 14 THEN p.PEDIDO_ID end),
    Total= (count(CASE WHEN pm.forma_pagamento_id = 1 THEN p.PEDIDO_ID end) + count(CASE WHEN pm.forma_pagamento_id = 14 THEN p.PEDIDO_ID end))
    FROM        
    PEDIDOS p INNER JOIN PedidosMeios pm  (nolock) ON p.PEDIDO_ID = pm.PEDIDO_ID
    WHERE (p.ENTIDADE_ID = @ent_id) AND (p.PEDIDO_STATUS_ID = 44) AND (p.PEDIDO_REGISTRO BETWEEN @data_inicial AND @data_final)
    GROUP BY convert(nvarchar (15),p.PEDIDO_REGISTRO,105) with rollup

     

     

     

    sexta-feira, 29 de agosto de 2008 20:15