none
Duvida de script com inversão de linhas em colunas RRS feed

  • Pergunta

  • Boa Tarde pessoal, estou fazendo um nó na minha cabeça tentando fazer um PIVOT da seguinte situação:

    *Tenho um script que faz o seguinte:

    USE
    Garagem
    SELECT 
    s.idlinha,
    t.descricao,
    count(c.tipo) AS Total
    FROM
    cartao c,
    Servico s,
    MeiaViagem mv,
    Tipos t
    WHERE
    ((c.idmv=mv.id)and mv.idsv=s.id)and (c.tipo=t.tipo) and
    c.datahora>='01/01/2012 00:01' and
    c.datahora<='31/01/2012 23:59'
    GROUP BY
    t.descricao,
    s.idlinha
    ORDER BY
    s.idlinha,
    t.descricao

    Resultado

    idlinha | descricao | Total

    01    | Acompa.     | 115

    01    | VT               | 354

    01    | Comum       | 815

    02B     | Acompa.     | 89

    02B     | VT              | 2210

    02B     | Comum      | 3510


    Gostaria que ficasse:

    idlinha | Acompa. | Comum | VT

    01    | 115             | 815      | 354

    02B     | 89               | 3510    | 2210

    Ou seja, a 'descricao' que é o tipo de cartão viraria coluna, mas a coluna 'idlinha' ficaria como está e a coluna 'total' se encaixaria com a coluna dos tipos de cartão.

    quarta-feira, 8 de fevereiro de 2012 18:51

Respostas

  • Segue mais um exemplo usando pivot table para SQL 2005 ou superior

    USE Garagem
    
    ;with cte_dados as 
    (
    SELECT 
    s.idlinha,
    t.descricao,
    count(c.tipo) AS Total
    FROM
    cartao c,
    Servico s,
    MeiaViagem mv,
    Tipos t
    WHERE
    ((c.idmv=mv.id)and mv.idsv=s.id)and (c.tipo=t.tipo) and
    c.datahora>='01/01/2012 00:01' and
    c.datahora<='31/01/2012 23:59'
    GROUP BY
    t.descricao,
    s.idlinha)
    
    SELECT idlinha, 
    [Acompa.], [VT], [Comum]
    FROM
    (SELECT idlinha, descricao, Total 
        FROM cte_dados) AS SourceTable
    PIVOT
    (
    sum(Total)
    FOR descricao IN ([Acompa.], [VT], [Comum])
    ) AS PivotTable;



    Att.
    Marcelo Fernandes

    MCP, MCDBA, MCSA, MCTS.
    Se útil, classifique!!!
    Me siga no twitter: @marcelodba


    segunda-feira, 13 de fevereiro de 2012 14:52
    Moderador

Todas as Respostas

  • Ninguem consegue me ajudar por favor?
    segunda-feira, 13 de fevereiro de 2012 12:53
  • Boa Tarde Jonas assim dá certo, porém você terá que passar as descrições fixas: DECLARE @TABELA TABLE (IDLINHA CHAR(03),DESCRICAO VARCHAR(10),TOTAL INT) INSERT INTO @TABELA VALUES ('01','Acompa.',115) INSERT INTO @TABELA VALUES ('01','VT',354) INSERT INTO @TABELA VALUES ('01','Comum',815) INSERT INTO @TABELA VALUES ('02B','Acompa.',89) INSERT INTO @TABELA VALUES ('02B','VT',2210) INSERT INTO @TABELA VALUES ('02B','Comum',3510) SELECT IDLINHA, sum(CASE WHEN DESCRICAO = 'Acompa.' THEN TOTAL ELSE 0 END) AS 'Acompa.', sum(CASE WHEN DESCRICAO = 'Comum' THEN TOTAL ELSE 0 END) AS 'Comum', sum(CASE WHEN DESCRICAO = 'VT' THEN TOTAL ELSE 0 END) AS 'VT' FROM @TABELA group by IDLINHA

    Paulo Katsuo Katayama Junior

    segunda-feira, 13 de fevereiro de 2012 14:28
  • Segue mais um exemplo usando pivot table para SQL 2005 ou superior

    USE Garagem
    
    ;with cte_dados as 
    (
    SELECT 
    s.idlinha,
    t.descricao,
    count(c.tipo) AS Total
    FROM
    cartao c,
    Servico s,
    MeiaViagem mv,
    Tipos t
    WHERE
    ((c.idmv=mv.id)and mv.idsv=s.id)and (c.tipo=t.tipo) and
    c.datahora>='01/01/2012 00:01' and
    c.datahora<='31/01/2012 23:59'
    GROUP BY
    t.descricao,
    s.idlinha)
    
    SELECT idlinha, 
    [Acompa.], [VT], [Comum]
    FROM
    (SELECT idlinha, descricao, Total 
        FROM cte_dados) AS SourceTable
    PIVOT
    (
    sum(Total)
    FOR descricao IN ([Acompa.], [VT], [Comum])
    ) AS PivotTable;



    Att.
    Marcelo Fernandes

    MCP, MCDBA, MCSA, MCTS.
    Se útil, classifique!!!
    Me siga no twitter: @marcelodba


    segunda-feira, 13 de fevereiro de 2012 14:52
    Moderador
  • Problema resolvido. Muito obrigado pela ajuda. Finalmente entendi o tal do Pivot.
    segunda-feira, 13 de fevereiro de 2012 17:53