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

SQL - pivot three rows into three columns with static column names?

我对 SQL 比较陌生,但我有一个疑问,

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

即returns最近的三个登录。

我将如何旋转查询,以便最终得到一个结果,其中每个日期都在其自己的列中,并且列 headers 是“1st”、“2nd”和“第三个?

谢谢!

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

您必须有一些可转换的数据来确定哪一列应获得什么值,因此您可以创建一个 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) 和 order by 不是必需的,我只是将其保留在那里作为限制器。如果登录次数少于 3 次,则该计数的列将为空,超过 3 次则不会显示......