2016-08-14 3 views
0

, 내가 SQL에 비교적 새로운 해요,하지만 난 쿼리가SQL - 세 행을 정적 열 이름이있는 세 개의 열로 피벗합니까?

세 가장 최근에 로그인을 반환
select top 3 LoginDateTime from UserLogins where Username = 'John Doe' order by LoginDateTime desc 

.

각 날짜가 자체 열에 있고 열 머리글이 '1st', '2nd'및 '3rd'인 결과로 끝나기 위해 쿼리를 피벗 팅하는 방법은 무엇입니까?

감사합니다.

추가 :이 쿼리는 특히 결과의 내용을 대상으로하는 MS SQL Server에서 실행됩니다 (향후 상위 3 개 이상의 로그인을 포함하도록 변경 될 수 있음). 심지어 열 제목 자체가 시간이 지남에 따라 변경되어야하는 경우가 될 수 있으므로 정적 제목 (프로그래밍 방식으로 생성 된 것과 반대)이 이상적인 솔루션이됩니다.

+0

몇 개의 항목이 누락되었습니다. 어떤 DBMS (SQL 서버, 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보다 적 으면 해당 개수의 열이 null이되고 3 이상은 표시되지 않습니다 .....

+0

그리고 그 대답은 잠을 18 시간없이 박탈했습니다! 정말 고맙습니다! –

관련 문제