none
Ajuda Urgente PIVOT RRS feed

  • Pergunta

  • Amigos estou querendo montar uma tabela com as seguintes caracteristica.

    Essa é a tabela atual:

    Account_Id Data_Execução
    6888241 2009-05-03 22:06:09.000
    6888241 2009-05-03 22:06:30.000
    6888241 2009-05-07 08:08:46.000
    6888241 2009-05-12 08:32:15.000
    6888241 2009-05-16 06:58:38.000
    6888241 2009-05-27 22:37:00.000
    6888241 2009-06-01 07:21:02.000
    6888241 2009-06-09 14:24:16.000

    Quero transformar nisso:

    Account_Id Data 1 Data 2 Data 3
    6888241 2009-05-03 22:06:09.000 2009-05-03 22:06:30.000 2009-05-07 08:08:46.000


    Poderiam me ajuda?

    Desde já agradeço


    Daniel
    quinta-feira, 2 de julho de 2009 14:21

Todas as Respostas

  • Alguem poderia ajudar?
    Daniel
    quinta-feira, 2 de julho de 2009 17:06
  • Ajuda ae galera.


    Daniel
    quinta-feira, 2 de julho de 2009 21:40
  • Bom Dia,

    Segue uma inspiração:

    create table t (Account_Id int, Data_Execucao smalldatetime)
    insert into t values (6888241, '2009-05-03 22:06:09.000')
    insert into t values (6888241, '2009-05-03 22:06:30.000')
    insert into t values (6888241, '2009-05-07 08:08:46.000')
    insert into t values (6888241, '2009-05-12 08:32:15.000')
    insert into t values (6888241, '2009-05-16 06:58:38.000')
    insert into t values (6888241, '2009-05-27 22:37:00.000')
    insert into t values (6888241, '2009-06-01 07:21:02.000')
    insert into t values (6888241, '2009-06-09 14:24:16.000')
    ;with datas (Account_Id, Data, Col) As (
     select Account_Id, Data_Execucao,
      'Data ' + CAST(ROW_NUMBER() OVER (ORDER BY Data_Execucao) As VARCHAR(4))
     from t)
    select Account_ID,
     (SELECT Data FROM datas As I WHERE E.Account_ID = I.Account_ID And Col = 'Data 1') As [Data 1],
     (SELECT Data FROM datas As I WHERE E.Account_ID = I.Account_ID And Col = 'Data 2') As [Data 2],
     (SELECT Data FROM datas As I WHERE E.Account_ID = I.Account_ID And Col = 'Data 3') As [Data 3],
     (SELECT Data FROM datas As I WHERE E.Account_ID = I.Account_ID And Col = 'Data 4') As [Data 4],
     (SELECT Data FROM datas As I WHERE E.Account_ID = I.Account_ID And Col = 'Data 5') As [Data 5],
     (SELECT Data FROM datas As I WHERE E.Account_ID = I.Account_ID And Col = 'Data 6') As [Data 6],
     (SELECT Data FROM datas As I WHERE E.Account_ID = I.Account_ID And Col = 'Data 7') As [Data 7],
     (SELECT Data FROM datas As I WHERE E.Account_ID = I.Account_ID And Col = 'Data 8') As [Data 8]
    from
     (SELECT DISTINCT Account_ID FROM T) As E


    Ressalto que embora a SQL seja poderosa, o seu propósito é recuperar, manipular e gravar dados. A capacidade de construir esse nível de customização de relatórios está longe de ser propósito da SQL e por isso ela parece ser tão limitada para situações como essa. Eu sugiro que você avalie outras soluções e ferramentas e se possível utilize uma linguagem de programação para atender a esse fim.

    A query está estática, o desafio de torná-la dinâmica é o próximo passo.

    [ ]s,

    Gustavo Maia Aguiar
    http://gustavomaiaaguiar.spaces.live.com

    O que é Cross Database Ownership Chaining ? - Parte I
    http://gustavomaiaaguiar.spaces.live.com/blog/cns!F4F5C630410B9865!620.entry

     


    Classifique as respostas. O seu feedback é imprescindível
    sexta-feira, 3 de julho de 2009 12:10
  • Amigo concordo plenamento com o que o Gustavo falou, o codigo que vou por abaixo faz o que o gustavo fez mas de forma dinamica, é so adaptar para sua tabela que dara certo, mas como ele disse não é a forma correta ou digamos a melhor prática.

    Create

     

    PROC [dbo].[RetornaTabelaFilho2]

    AS

     

    BEGIN

     

    DECLARE @Pai AS INT

     

    DECLARE @Campo AS INT

     

    DECLARE @SQL AS NVARCHAR(1000)

     

    DECLARE @CreateTable AS NVARCHAR(250)

     

    DECLARE @InsertTable AS NVARCHAR(250)

     

    SET @SQL = ''

     

    SET @CreateTable = ''

     

    SET @InsertTable = ''

     

     

    DECLARE cur_TabelaPai CURSOR FOR

     

     

    SELECT Pai.IDPai

     

    FROM Pai

     

    OPEN cur_TabelaPai

     

    FETCH NEXT FROM cur_TabelaPai INTO @Pai

     

    WHILE @@FETCH_STATUS = 0

     

    BEGIN

     

     

    DECLARE cur_TabelaFilho CURSOR FOR

     

    SELECT Filho.IDFilho

     

    FROM Filho

     

    JOIN Pai ON Filho.IDPai = Pai.IDPai

     

    WHERE Filho.IDPai = @Pai

     

    OPEN cur_TabelaFilho

     

    FETCH NEXT FROM cur_TabelaFilho INTO @Campo

     

     

    SET @CreateTable = ''

     

    SET @InsertTable = ''

     

    WHILE @@FETCH_STATUS = 0

     

    BEGIN

     

    SET @CreateTable = @CreateTable + ',' + 'Field_' + CONVERT(NVARCHAR,@Campo) + ' INT NULL'

     

    SET @InsertTable = @InsertTable + ',' + CONVERT(NVARCHAR,@Campo)

     

    FETCH NEXT FROM cur_TabelaFilho INTO @Campo

     

    END

     

    CLOSE cur_TabelaFilho

     

    DEALLOCATE cur_TabelaFilho

     

    IF (@CreateTable <> '')

     

    BEGIN

     

    SET @CreateTable = SUBSTRING(@CreateTable,2,LEN(@CreateTable))

     

    SET @InsertTable = SUBSTRING(@InsertTable,2,LEN(@InsertTable))

     

    SET @SQL = 'CREATE TABLE #TabelaFilho (CodigoPai INT NOT NULL, ' + @CreateTable + ')' + CHAR(13) + CHAR(10)

     

    SET @SQL = @SQL + 'INSERT INTO #TabelaFilho (CodigoPai, ' + REPLACE(@CreateTable,' INT NULL','') + ') SELECT ' + CONVERT(NVARCHAR,@Pai) + ',' + @InsertTable + CHAR(13) + CHAR(10)

     

    SET @SQL = @SQL + 'SELECT * FROM #TabelaFilho' + CHAR(13) + CHAR(10)

     

    SET @SQL = @SQL + 'DROP TABLE #TabelaFilho'

     

    EXEC (@SQL)

     

    END

     

     

    FETCH NEXT FROM cur_TabelaPai INTO @Pai

     

    END

     

    CLOSE cur_TabelaPai

     

    DEALLOCATE cur_TabelaPai

    END


    DBA SQL Server MCTS - SQL Server 2005 | ITIL Foundation V2 http://www.bydocs.com
    sábado, 4 de julho de 2009 22:42
  • DrAlves, atendeu sua necessidade?
    DBA SQL Server MCTS - SQL Server 2005 | ITIL Foundation V2 http://www.bydocs.com
    sábado, 15 de agosto de 2009 23:36