AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 100899
Accepted
Kin Shah
Kin Shah
Asked: 2015-05-08 08:47:24 +0800 CST2015-05-08 08:47:24 +0800 CST 2015-05-08 08:47:24 +0800 CST

Ajuda com consulta PIVOT

  • 772

Tenho uma tabela com a estrutura abaixo:

CREATE TABLE [dbo].[AUDIT_SCHEMA_VERSION](
    [SCHEMA_VER_MAJOR] [int] NOT NULL,
    [SCHEMA_VER_MINOR] [int] NOT NULL,
    [SCHEMA_VER_SUB] [int] NOT NULL,
    [SCHEMA_VER_DATE] [datetime] NOT NULL,
    [SCHEMA_VER_REMARK] [varchar](250) NULL
);

alguns dados de amostra (parece problema com o sqlfiddle .. colocando alguns dados de amostra):

INSERT INTO [AUDIT_SCHEMA_VERSION]([SCHEMA_VER_MAJOR],[SCHEMA_VER_MINOR],[SCHEMA_VER_SUB],[SCHEMA_VER_DATE],[SCHEMA_VER_REMARK])
VALUES(1,6,13,CAST('20130405 04:41:25.000' as DATETIME),'Stored procedure build')
INSERT INTO [AUDIT_SCHEMA_VERSION]([SCHEMA_VER_MAJOR],[SCHEMA_VER_MINOR],[SCHEMA_VER_SUB],[SCHEMA_VER_DATE],[SCHEMA_VER_REMARK])
VALUES(1,6,13,CAST('20130405 04:41:25.000' as DATETIME),'Stored procedure build')
INSERT INTO [AUDIT_SCHEMA_VERSION]([SCHEMA_VER_MAJOR],[SCHEMA_VER_MINOR],[SCHEMA_VER_SUB],[SCHEMA_VER_DATE],[SCHEMA_VER_REMARK])
VALUES(1,7,13,CAST('20130405 04:41:25.000' as DATETIME),'Stored procedure build')
INSERT INTO [AUDIT_SCHEMA_VERSION]([SCHEMA_VER_MAJOR],[SCHEMA_VER_MINOR],[SCHEMA_VER_SUB],[SCHEMA_VER_DATE],[SCHEMA_VER_REMARK])
VALUES(1,10,13,CAST('20130405 04:41:25.000' as DATETIME),'Stored procedure build')
INSERT INTO [AUDIT_SCHEMA_VERSION]([SCHEMA_VER_MAJOR],[SCHEMA_VER_MINOR],[SCHEMA_VER_SUB],[SCHEMA_VER_DATE],[SCHEMA_VER_REMARK])
VALUES(1,12,13,CAST('20130405 04:41:25.000' as DATETIME),'Stored procedure build')
INSERT INTO [AUDIT_SCHEMA_VERSION]([SCHEMA_VER_MAJOR],[SCHEMA_VER_MINOR],[SCHEMA_VER_SUB],[SCHEMA_VER_DATE],[SCHEMA_VER_REMARK])
VALUES(1,12,13,CAST('20130405 04:41:25.000' as DATETIME),'Stored procedure build')
INSERT INTO [AUDIT_SCHEMA_VERSION]([SCHEMA_VER_MAJOR],[SCHEMA_VER_MINOR],[SCHEMA_VER_SUB],[SCHEMA_VER_DATE],[SCHEMA_VER_REMARK])
VALUES(1,16,13,CAST('20130405 04:41:25.000' as DATETIME),'Stored procedure build')
INSERT INTO [AUDIT_SCHEMA_VERSION]([SCHEMA_VER_MAJOR],[SCHEMA_VER_MINOR],[SCHEMA_VER_SUB],[SCHEMA_VER_DATE],[SCHEMA_VER_REMARK])
VALUES(1,16,13,CAST('20130405 04:41:25.000' as DATETIME),'Stored procedure build')
INSERT INTO [AUDIT_SCHEMA_VERSION]([SCHEMA_VER_MAJOR],[SCHEMA_VER_MINOR],[SCHEMA_VER_SUB],[SCHEMA_VER_DATE],[SCHEMA_VER_REMARK])
VALUES(1,16,13,CAST('20130405 04:41:25.000' as DATETIME),'Stored procedure build')
INSERT INTO [AUDIT_SCHEMA_VERSION]([SCHEMA_VER_MAJOR],[SCHEMA_VER_MINOR],[SCHEMA_VER_SUB],[SCHEMA_VER_DATE],[SCHEMA_VER_REMARK])
VALUES(1,16,13,CAST('20140417 18:10:44.100' as DATETIME),'Stored procedure build')
INSERT INTO [AUDIT_SCHEMA_VERSION]([SCHEMA_VER_MAJOR],[SCHEMA_VER_MINOR],[SCHEMA_VER_SUB],[SCHEMA_VER_DATE],[SCHEMA_VER_REMARK])
VALUES(2,5,0,CAST('20140417 18:14:14.157' as DATETIME),'Stored procedure build')
INSERT INTO [AUDIT_SCHEMA_VERSION]([SCHEMA_VER_MAJOR],[SCHEMA_VER_MINOR],[SCHEMA_VER_SUB],[SCHEMA_VER_DATE],[SCHEMA_VER_REMARK])
VALUES(2,6,0,CAST('20140417 18:14:23.327' as DATETIME),'Stored procedure build')
INSERT INTO [AUDIT_SCHEMA_VERSION]([SCHEMA_VER_MAJOR],[SCHEMA_VER_MINOR],[SCHEMA_VER_SUB],[SCHEMA_VER_DATE],[SCHEMA_VER_REMARK])
VALUES(2,7,0,CAST('20140417 18:14:32.270' as DATETIME),'Stored procedure build')
INSERT INTO [AUDIT_SCHEMA_VERSION]([SCHEMA_VER_MAJOR],[SCHEMA_VER_MINOR],[SCHEMA_VER_SUB],[SCHEMA_VER_DATE],[SCHEMA_VER_REMARK])
VALUES(2,8,0,CAST('20141209 09:38:40.700' as DATETIME),'Stored procedure build')
INSERT INTO [AUDIT_SCHEMA_VERSION]([SCHEMA_VER_MAJOR],[SCHEMA_VER_MINOR],[SCHEMA_VER_SUB],[SCHEMA_VER_DATE],[SCHEMA_VER_REMARK])
VALUES(2,9,0,CAST('20141209 09:43:04.237' as DATETIME),'Stored procedure build')
INSERT INTO [AUDIT_SCHEMA_VERSION]([SCHEMA_VER_MAJOR],[SCHEMA_VER_MINOR],[SCHEMA_VER_SUB],[SCHEMA_VER_DATE],[SCHEMA_VER_REMARK])
VALUES(2,10,0,CAST('20141209 09:45:19.893' as DATETIME),'Stored procedure build')
INSERT INTO [AUDIT_SCHEMA_VERSION]([SCHEMA_VER_MAJOR],[SCHEMA_VER_MINOR],[SCHEMA_VER_SUB],[SCHEMA_VER_DATE],[SCHEMA_VER_REMARK])
VALUES(2,13,0,CAST('20150323 14:54:30.847' as DATETIME),'Stored procedure build')
INSERT INTO [AUDIT_SCHEMA_VERSION]([SCHEMA_VER_MAJOR],[SCHEMA_VER_MINOR],[SCHEMA_VER_SUB],[SCHEMA_VER_DATE],[SCHEMA_VER_REMARK])
VALUES(1,10,13,CAST('20130405 04:41:25.000' as DATETIME),'Stored procedure build')
INSERT INTO [AUDIT_SCHEMA_VERSION]([SCHEMA_VER_MAJOR],[SCHEMA_VER_MINOR],[SCHEMA_VER_SUB],[SCHEMA_VER_DATE],[SCHEMA_VER_REMARK])
VALUES(1,16,14,CAST('20140417 18:11:07.977' as DATETIME),'Stored procedure build')
INSERT INTO [AUDIT_SCHEMA_VERSION]([SCHEMA_VER_MAJOR],[SCHEMA_VER_MINOR],[SCHEMA_VER_SUB],[SCHEMA_VER_DATE],[SCHEMA_VER_REMARK])
VALUES(1,16,15,CAST('20140417 18:11:13.130' as DATETIME),'Stored procedure build')
INSERT INTO [AUDIT_SCHEMA_VERSION]([SCHEMA_VER_MAJOR],[SCHEMA_VER_MINOR],[SCHEMA_VER_SUB],[SCHEMA_VER_DATE],[SCHEMA_VER_REMARK])
VALUES(2,2,0,CAST('20140417 18:12:11.200' as DATETIME),'Stored procedure build')
INSERT INTO [AUDIT_SCHEMA_VERSION]([SCHEMA_VER_MAJOR],[SCHEMA_VER_MINOR],[SCHEMA_VER_SUB],[SCHEMA_VER_DATE],[SCHEMA_VER_REMARK])
VALUES(2,3,0,CAST('20140417 18:12:33.330' as DATETIME),'Stored procedure build')
INSERT INTO [AUDIT_SCHEMA_VERSION]([SCHEMA_VER_MAJOR],[SCHEMA_VER_MINOR],[SCHEMA_VER_SUB],[SCHEMA_VER_DATE],[SCHEMA_VER_REMARK])
VALUES(2,4,0,CAST('20140417 18:12:48.803' as DATETIME),'Stored procedure build')
INSERT INTO [AUDIT_SCHEMA_VERSION]([SCHEMA_VER_MAJOR],[SCHEMA_VER_MINOR],[SCHEMA_VER_SUB],[SCHEMA_VER_DATE],[SCHEMA_VER_REMARK])
VALUES(1,13,13,CAST('20130405 04:41:25.000' as DATETIME),'Stored procedure build')
INSERT INTO [AUDIT_SCHEMA_VERSION]([SCHEMA_VER_MAJOR],[SCHEMA_VER_MINOR],[SCHEMA_VER_SUB],[SCHEMA_VER_DATE],[SCHEMA_VER_REMARK])
VALUES(1,16,13,CAST('20130405 04:41:25.000' as DATETIME),'Stored procedure build')
INSERT INTO [AUDIT_SCHEMA_VERSION]([SCHEMA_VER_MAJOR],[SCHEMA_VER_MINOR],[SCHEMA_VER_SUB],[SCHEMA_VER_DATE],[SCHEMA_VER_REMARK])
VALUES(2,11,0,CAST('20141209 09:45:58.993' as DATETIME),'Stored procedure build')
INSERT INTO [AUDIT_SCHEMA_VERSION]([SCHEMA_VER_MAJOR],[SCHEMA_VER_MINOR],[SCHEMA_VER_SUB],[SCHEMA_VER_DATE],[SCHEMA_VER_REMARK])
VALUES(2,12,0,CAST('20141209 09:46:50.070' as DATETIME),'Stored procedure build');

Aqui está o SQLFiddlecom alguns dados de amostra.

Alguém com experiência em T-sql pode me orientar sobre como alcançar o resultado final? Eu sei que PIVOT(com colunas dinâmicas) será a abordagem certa, mas não consigo descobrir.

Resultados esperados :

insira a descrição da imagem aqui

Até agora, tenho abaixo:

select row_number() over (
        partition by CONVERT(varchar(10), SCHEMA_VER_DATE, 110) order by SCHEMA_VER_DATE 
        ) as rownum
    ,CONVERT(varchar(10), SCHEMA_VER_DATE, 110) as UPG_DATE
    ,CONVERT(varchar(1), SCHEMA_VER_MAJOR) + '.' + CONVERT(varchar(2), SCHEMA_VER_MINOR) + '.' + CONVERT(varchar(2), SCHEMA_VER_SUB) as SCHEMA_VER
from audit_schema_version
where SCHEMA_VER_REMARK like 'Stored procedure build'
order by UPGRADE_DATE 

insira a descrição da imagem aqui

sql-server sql-server-2008-r2
  • 2 2 respostas
  • 768 Views

2 respostas

  • Voted
  1. Best Answer
    Taryn
    2015-05-08T11:48:26+08:002015-05-08T11:48:26+08:00

    Isso é um pouco confuso para obter o resultado final porque você tem vários SCHEMA_VERpara cada data. Antes de demonstrar como fazer isso com SQL dinâmico, primeiro mostrarei como fazer isso com código estático para obter a lógica correta. Para obter o resultado final, você pode utilizar tanto o pivô quanto o não pivô.

    Mas primeiro, eu mudaria sua consulta original para usar o seguinte:

    select 
        row_number() over (
        partition by CONVERT(varchar(10), SCHEMA_VER_DATE, 110) order by SCHEMA_VER_MAJOR, SCHEMA_VER_MINOR, SCHEMA_VER_SUB
        ) as minrownum
    , row_number() over (
        partition by CONVERT(varchar(10), SCHEMA_VER_DATE, 110) order by SCHEMA_VER_MAJOR desc, SCHEMA_VER_MINOR desc, SCHEMA_VER_SUB desc
        ) as maxrownum
    ,CONVERT(varchar(10), SCHEMA_VER_DATE, 110) as UPG_DATE
    ,CONVERT(varchar(1), SCHEMA_VER_MAJOR) + '.' + CONVERT(varchar(2), SCHEMA_VER_MINOR) + '.' + CONVERT(varchar(2), SCHEMA_VER_SUB) as SCHEMA_VER
    from audit_schema_version
    where SCHEMA_VER_REMARK like 'Stored procedure build';
    

    Consulte SQL Fiddle com demonstração . Eu costumava row_number()pegar o primeiro e o último SCHEMA_VERde cada data. Isso é necessário para que você possa concatenar apenas esses valores juntos para o comentário.

    Em seguida, eu usaria uma tabela temporária para armazenar as linhas que possuem um minrownume maxrownumde 1. A tabela temporária conteria o upg_datee o comment. Esta coluna de comentário contém uma string concatenada do par de SCHEMA_VERpara cada data.

    create table #srcData
    (
        upg_date varchar(10),
        comment varchar(500)
    );
    

    O código para preencher a tabela temporária seria então:

    ;with cte as
    (
      select 
            row_number() over (
            partition by CONVERT(varchar(10), SCHEMA_VER_DATE, 110) order by SCHEMA_VER_MAJOR, SCHEMA_VER_MINOR, SCHEMA_VER_SUB
            ) as minrownum
        , row_number() over (
            partition by CONVERT(varchar(10), SCHEMA_VER_DATE, 110) order by SCHEMA_VER_MAJOR desc, SCHEMA_VER_MINOR desc, SCHEMA_VER_SUB desc
            ) as maxrownum
        ,CONVERT(varchar(10), SCHEMA_VER_DATE, 110) as UPG_DATE
        ,CONVERT(varchar(1), SCHEMA_VER_MAJOR) + '.' + CONVERT(varchar(2), SCHEMA_VER_MINOR) + '.' + CONVERT(varchar(2), SCHEMA_VER_SUB) as SCHEMA_VER
      from audit_schema_version
      where SCHEMA_VER_REMARK like 'Stored procedure build'
    )
    insert into #srcData
    select distinct
        c1.UPG_DATE,
        comment 
            = STUFF((
                      SELECT ' - ' + c2.SCHEMA_VER 
                      FROM cte c2
                      WHERE (c2.minrownum = 1 or c2.maxrownum = 1)
                        and c1.upg_date = c2.upg_date
                      order by c2.minrownum
                      FOR XML PATH(''), TYPE).value('.[1]', 'nvarchar(max)'), 1, 2, '') 
    from cte c1
    where c1.minrownum = 1 or c1.maxrownum = 1;
    

    Esta primeira passagem pelos seus dados permite:

    |   upg_date |           comment |
    |------------|-------------------|
    | 03-23-2015 |            2.13.0 |
    | 04-05-2013 |  1.6.13 - 1.16.13 |
    | 04-17-2014 |   1.16.13 - 2.7.0 |
    | 12-09-2014 |    2.8.0 - 2.12.0 |
    

    Agora você ainda precisa obter uma contagem de cada data para o ano e o comentário concatenado completo. É aqui que o não pivô entra em jogo. Você pode usar o código a seguir para criar o comentário completo para cada ano e obter a contagem.

    select distinct 
        Yr =  right(s1.upg_date, 4),
        cnt = count(*) over(partition by right(s1.upg_date, 4)),
        fullcomment 
                = STUFF((
                          SELECT '; ' + s2.comment 
                          FROM #srcData s2
                          WHERE right(s1.upg_date, 4) = right(s2.upg_date, 4)
                          FOR XML PATH(''), TYPE).value('.[1]', 'nvarchar(max)'), 1, 2, '') 
    from #srcData s1;
    

    Consulte SQL Fiddle com demonstração . Os dados agora se parecem com:

    |   Yr | cnt |                       fullcomment |
    |------|-----|-----------------------------------|
    | 2013 |   1 |                  1.6.13 - 1.16.13 |
    | 2014 |   2 |  1.16.13 - 2.7.0;  2.8.0 - 2.12.0 |
    | 2015 |   1 |                            2.13.0 |
    

    Como você pode ver, você tem várias colunas que precisam ser dinamizadas, para que você possa desarticular a coluna fullcommente cntem várias linhas. Isso pode ser feito usando a função UNPIVOT ou CROSS APPLY. Prefiro a aplicação cruzada aqui porque você deseja concatenar valores para criar os novos nomes de coluna:

    ;with cte as
    (
        select distinct 
            Yr =  right(s1.upg_date, 4),
            cnt = count(*) over(partition by right(s1.upg_date, 4)),
            fullcomment 
                    = STUFF((
                              SELECT '; ' + s2.comment 
                              FROM #srcData s2
                              WHERE right(s1.upg_date, 4) = right(s2.upg_date, 4)
                              FOR XML PATH(''), TYPE).value('.[1]', 'nvarchar(max)'), 1, 2, '') 
        from #srcData s1
    ) 
    select [2015], [2015_comment], [2014], [2014_comment], [2013], [2013_comment]
    from
    (
        select c.col, val
        from cte d
        cross apply
        (
            values 
                (Yr, cast(cnt as nvarchar(50))),
                (Yr+'_comment', fullcomment)
        ) c (col, val)  
    ) d
    pivot
    (
        max(val)
        for col in ([2015], [2015_comment], [2014], [2014_comment], [2013], [2013_comment])
    ) piv;
    

    Consulte SQL Fiddle com demonstração .

    Depois de obter a lógica, você pode convertê-la facilmente em SQL dinâmico.

    -- get list of the columns
    DECLARE @cols AS NVARCHAR(MAX),
        @query  AS NVARCHAR(MAX)
    
    select @cols = STUFF((SELECT  ',' + QUOTENAME(col) 
                        from #srcData
                        cross apply
                        (
                            select right(upg_date, 4), right(upg_date, 4), 2 union all
                            select right(upg_date, 4), right(upg_date, 4)+'_comment', 1
                        ) c (yr, col, so)
                        group by yr, col, so
                        order by yr desc, so desc
                FOR XML PATH(''), TYPE
                ).value('.', 'NVARCHAR(MAX)') 
            ,1,1,'')
    
    set @query 
        = 'SELECT ' + @cols + ' 
            from 
            (
                select c.col, val
                from
                (
                    select distinct 
                        Yr =  right(s1.upg_date, 4),
                        cnt = count(*) over(partition by right(s1.upg_date, 4)),
                        fullcomment 
                                = STUFF((
                                          SELECT ''; '' + s2.comment 
                                          FROM #srcData s2
                                          WHERE right(s1.upg_date, 4) = right(s2.upg_date, 4)
                                          FOR XML PATH(''''), TYPE).value(''.[1]'', ''nvarchar(max)''), 1, 2, '''') 
                    from #srcData s1
                ) d
                cross apply
                (
                    values 
                        (Yr, cast(cnt as nvarchar(50))),
                        (Yr+''_comment'', fullcomment)
                ) c (col, val)  
            ) x
            pivot 
            (
               max(val)
               for col in (' + @cols + ')
            ) p '
    
    exec sp_executesql @query;
    

    Consulte SQL Fiddle com demonstração . Ambas as versões lhe darão o resultado:

    | 2015 | 2015_comment | 2014 |                      2014_comment | 2013 |      2013_comment |
    |------|--------------|------|-----------------------------------|------|-------------------|
    |    1 |       2.13.0 |    2 |  1.16.13 - 2.7.0;  2.8.0 - 2.12.0 |    1 |  1.6.13 - 1.16.13 |
    
    • 20
  2. JoseTeixeira
    2015-05-08T12:00:02+08:002015-05-08T12:00:02+08:00

    Adicionando explicação e um violino: http://sqlfiddle.com/#!6/c92b2/5 .

    A consulta abaixo:
    1. usa uma subconsulta para selecionar as versões min e max por data (min e max são aplicados a números inteiros para garantir que por instância 6 < 16)
    2. Em seguida, seleciona o ano (para agrupar posteriormente), Data (para pedido) e as versões min - max

    SELECT LEFT(UPG_DATE, 4) AS Year
        , UPG_DATE
        , CONVERT(varchar(1), MIN_VER/1000000) + '.' + CONVERT(varchar(2), (MIN_VER/1000 - (MIN_VER/1000000)*1000)) + '.' + CONVERT(varchar(2), MIN_VER%1000)
            + ' - ' + CONVERT(varchar(1), MAX_VER/1000000) + '.' + CONVERT(varchar(2), (MAX_VER/1000 - (MAX_VER/1000000)*1000)) + '.' + CONVERT(varchar(2), MAX_VER%1000) AS Versions
    INTO #Versions
    FROM (
        SELECT CONVERT(varchar(10), SCHEMA_VER_DATE, 112) as UPG_DATE
            , MIN(SCHEMA_VER_MAJOR*1000000 + SCHEMA_VER_MINOR*1000 + SCHEMA_VER_SUB) AS MIN_VER
            , MAX(SCHEMA_VER_MAJOR*1000000 + SCHEMA_VER_MINOR*1000 + SCHEMA_VER_SUB) AS MAX_VER
        FROM audit_schema_version
        WHERE SCHEMA_VER_REMARK like 'Stored procedure build'
        GROUP BY CONVERT(varchar(10), SCHEMA_VER_DATE, 112)
    ) Versions;
    

    A seguir, como cada coluna será repetida (year e year_COMMENT), duas colunas são selecionadas para identificar os dados. As datas são contadas para saber o número de atualizações e as Versões são agrupadas por ano, enchendo para que fique tudo em uma linha. Isso nos dá a mesa final que será usada para pivotar.

    SELECT Year, Year + '_COMMENT' as Year_COMMENT
        , COUNT(Year) AS Upgrades
        , STUFF((SELECT ' ; ' + SUB.Versions
                    FROM #Versions SUB
                    WHERE SUB.Year = V.Year
                    ORDER BY UPG_DATE ASC
                    FOR XML PATH(''), TYPE
                    ).value('.', 'NVARCHAR(2000)')
                ,1,3,'') Versions
    INTO #GroupedResults
    FROM #Versions V
    GROUP BY Year
    
    SELECT * FROM #GroupedResults
    

    Aqui estão os resultados:

    | Year | Year_COMMENT | Upgrades | Versions                         |
    |------|--------------|----------|----------------------------------|
    | 2013 | 2013_COMMENT | 1        | 1.6.13 - 1.16.13                 |
    | 2014 | 2014_COMMENT | 2        | 1.16.13 - 2.7.0 ; 2.8.0 - 2.12.0 |
    | 2015 | 2015_COMMENT | 1        | 2.13.0 - 2.13.0                  |
    

    Em seguida, uma variável é preenchida com as colunas, ordenadas como queremos exibi-las:

    DECLARE @cols VARCHAR(1000),
        @finalQuery VARCHAR(2000)
    
    SELECT @cols = STUFF((SELECT ',' + QUOTENAME(YEAR) + ',' + QUOTENAME(YEAR + '_COMMENT')
                        FROM #GroupedResults
                        GROUP BY YEAR
                        ORDER BY YEAR DESC
                        FOR XML PATH(''), TYPE
                        ).value('.', 'NVARCHAR(2000)')
        ,1,1,'')
    

    Finalmente, a query abaixo usa cross apply, então obtemos:
    1. A coluna col preenchida com os valores Year e Year_COMMENT
    2. A coluna value preenchida com o número de atualizações, nas linhas correspondentes aos anos, e valores das versões, no linhas correspondentes a Year_COMMENTs
    Um pivô é usado sobre as duas colunas resultantes, dando-nos os valores (número de atualizações alternando com versões) sobre a coluna (Anos alternando com Year_COMMENTs)

    set @finalQuery = N'SELECT ' + @cols + N' from 
                 (
                    select col, value
                    from #GroupedResults
                    cross apply
                    (
                        SELECT CAST(Upgrades AS VARCHAR(200)), Year
                        UNION ALL
                        SELECT CAST(Versions AS VARCHAR(200)), Year_COMMENT
                    ) c (value, col)
                ) x
                pivot 
                (
                    Min(value)
                    for col in (' + @cols + N')
                ) p1
                ; '
    
    EXEC (@finalQuery);
    
    DROP TABLE #Versions;
    DROP TABLE #GroupedResults;
    

    Isso retorna os seguintes resultados:

    | 2015 | 2015_COMMENT    | 2014 | 2014_COMMENT                     | 2013 | 2013_COMMENT     |
    |------|-----------------|------|----------------------------------|------|------------------|
    | 1    | 2.13.0 - 2.13.0 | 2    | 1.16.13 - 2.7.0 ; 2.8.0 - 2.12.0 | 1    | 1.6.13 - 1.16.13 |
    
    • 5

relate perguntas

  • SQL Server - Como as páginas de dados são armazenadas ao usar um índice clusterizado

  • Preciso de índices separados para cada tipo de consulta ou um índice de várias colunas funcionará?

  • Quando devo usar uma restrição exclusiva em vez de um índice exclusivo?

  • Quais são as principais causas de deadlocks e podem ser evitadas?

  • Como determinar se um Índice é necessário ou necessário

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve