2012-05-08 38 views
2

My Current in used TableSQL Server的SELECT查詢,行數據的列皈依像PIVOT

這是我的表#EmployeeTemp

我想要做的是檢索下面的數據。

To display like that style

所以首先,我使用下面的查詢,因爲我想要檢索的數據。

CREATE TABLE #EmployeeTemp 
(Employee_Name VARCHAR(50), 
Confirmed_Date DATETIME, 
Field_Type VARCHAR(50), 
Field_Value VARCHAR(50)) 

INSERT INTO #EmployeeTemp VALUES ('John', '2009/1/1', 'Title', 'Programmer'); 
INSERT INTO #EmployeeTemp VALUES ('John', '2009/1/1', 'Department', 'IT Department'); 
INSERT INTO #EmployeeTemp VALUES ('John', '2011/1/1', 'Title', 'Sr. Programmer'); 
INSERT INTO #EmployeeTemp VALUES ('David', '2010/1/1', 'Title', 'Software Engineer'); 
INSERT INTO #EmployeeTemp VALUES ('David', '2010/1/1', 'Department', 'IT Department'); 

SELECT * FROM #EmployeeTemp 

SELECT 
MyEmployee.Confirmed_Date, 
MyEmployee.Employee_Name, 
Title = MAX(MyEmployee.Field_Value), 
Department = (SELECT 
        Field_Value 
       FROM #EmployeeTemp 
       WHERE Field_Type = 'Department' 
       AND Employee_Name = MyEmployee.Employee_Name 
       GROUP BY Employee_Name, Field_Value) 
FROM #EmployeeTemp AS MyEmployee 
WHERE MyEmployee.Confirmed_Date IN (SELECT MAX(Confirmed_Date) FROM #EmployeeTemp GROUP BY Employee_Name) 
GROUP BY MyEmployee.Employee_Name, MyEmployee.Confirmed_Date 
ORDER BY MyEmployee.Confirmed_Date DESC 

它按我的意思工作。但是我想問的是你能否給我任何建議,以更專業的方式寫出查詢。

每個建議將不勝感激。

我正在使用Microsoft SQL Server 2008版本。

回答

2

這個問題是非常主觀的,所以在我看來是一個更優雅的解決方案,可能是別人的意見不太優雅的解決方案。但是,這是我將採用的方法,使用SQL-Server PIVOT功能。

;WITH Employees AS 
( SELECT *, 
      MAX(Confirmed_Date) OVER(PARTITION BY Employee_Name, Field_Type) [MaxFieldConfirmedDate], 
      MAX(Confirmed_Date) OVER(PARTITION BY Employee_Name) [MaxConfirmedDate] 
    FROM #EmployeeTemp 
) 
SELECT * 
FROM ( SELECT MaxConfirmedDate [Confirmed_Date], Employee_name, Field_Type, Field_Value 
      FROM Employees 
      WHERE Confirmed_Date = MaxFieldConfirmedDate 
     ) data 
     PIVOT 
     ( MAX(Field_Value) 
      FOR Field_Type IN ([Title], [Department]) 
     ) Pvt 

我更喜歡這種方式的原因是,首先它是在服務器上的工作少(相較於這一個檢查您所查詢的實際執行計劃時,這個人有相對27%的批次A成本,反對你的73%的成本)。其次,如果您需要添加更多字段,則只需擴展以下行即可:

FOR Field_Type IN ([Title], [Department]) 

例如,具有以下額外的數據:

INSERT INTO #EmployeeTemp VALUES ('John', '2011/1/1', 'Test', 'Test'); 
INSERT INTO #EmployeeTemp VALUES ('David', '2010/1/1', 'Test', 'Test'); 

你只需要進行行:

FOR Field_Type IN ([Title], [Department], [Test]) 

得到輸出所需的額外列。

+0

非常感謝你@GarethD,你的建議幫了我很多。 –