SQL - 使用静态列名将三行转换为三列?

时间:2016-08-14 19:25:09

标签: sql sql-server pivot

我对SQL比较新,但我有一个查询,

select top 3 LoginDateTime from UserLogins where Username = 'John Doe' order by LoginDateTime desc

返回最近的三次登录。

我将如何转动查询,以便最终得到一个结果,其中每个日期都在其自己的列中,列标题为“第一个'”,第二个&#39 ;和' 3'?

谢谢!

ADDENDUM:查询在MS SQL Server上运行,专门针对结果的内容(将来可能会更改,以包含不仅仅是前三个登录)。它甚至可能成为列标题本身必须随时间变化的情况,因此静态标题(与编程生成相反)将是理想的解决方案。

1 个答案:

答案 0 :(得分:2)

您必须有一些东西可以转向以确定哪个列应该获得什么值,因此您可以创建row_number然后转动该数据。这是测试数据的一个例子。

DECLARE @UserLogins AS TABLE (LoginDateTime DATETIME, UserName VARCHAR(20))

    INSERT INTO @UserLogins (LoginDateTime, UserName)
    VALUES
    (GETDATE(),'John Doe')
    ,(GETDATE() -1,'John Doe')
    ,(GETDATE() -2,'John Doe')
    ,(GETDATE() -3,'John Doe')
    ,(GETDATE() -4,'John Doe')

    ;WITH cteRowNum  AS (
        SELECT TOP (3)
           UserName
           ,LoginDateTime
           ,RowNum = ROW_NUMBER() OVER (PARTITION BY 1 ORDER BY LoginDateTime DESC)
        FROM
           @UserLogins
        WHERE
           UserName = 'John Doe'
        ORDER BY
           LoginDateTime DESC
    )

    SELECT
        UserName
        ,[1] as [1st]
        ,[2] as [2nd]
        ,[3] as [3rd]
    FROM
        cteRowNum
        PIVOT (
           MAX(LoginDateTime)
           FOR RowNum IN ([1],[2],[3])
        ) p

注意SELECT TOP(3)并且必须按顺序排列我只是将它作为限制器保留在那里。如果登录少于3次,则该计数的列将为空,超过3只不会显示.....