2016-08-14 30 views
0

我是比較新的SQL,但我有一個查詢,SQL - 使用靜態列名稱將三行轉換爲三列?

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

返回最近的三個登錄。

我該如何解決這個查詢問題,這樣我最終得到的結果是每個日期都在自己的列中,而列標題是'1st','2nd'和'3rd'的結果?

謝謝!

附錄:查詢在MS SQL Server上運行,專門針對結果的內容(將來可能會更改以包含不止前三個登錄名)。它甚至可能會成爲一種情況,列標題本身必須隨時間而改變,所以靜態標題(與編程生成的相反)將是理想的解決方案。

+0

缺少一些項目。哪個DBMS(SQL Server,MySQL,??)和版本。你還在尋找一個動態數據透視表(所有日期)還是僅僅前3個登錄? –

回答

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次則不顯示.....

+0

這就是沒有睡眠的18小時的答案剝奪了我的權利!非常感謝! –