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 次则不会显示......
我对 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 次则不会显示......