2

使用済みテーブルの現在

それが私のテーブル#EmployeeTempです。

私がやりたいのは、以下のようなデータを取得することです。

そのスタイルのように表示するには

そこでまず、以下のクエリを使用して、必要に応じてデータを取得します。

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 SQLServer2008バージョンを使用しています。

4

1 に答える 1

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% のコストがかかりました。あなたのもの)。次に、さらにフィールドを追加する必要がある場合は、次の行を拡張するだけです。

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])

出力に必要な追加の列を取得します。

于 2012-05-08T07:58:51.187 に答える