SQL Server SELECT 查询,行数据到列的转换(如 PIVOT)

标签 sql sql-server sql-server-2008 t-sql pivot

My Current in used Table

这是我的表#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 版本。

最佳答案

这个问题非常主观,所以在我看来是一个更优雅的解决方案,在其他人看来可能是一个不太优雅的解决方案。然而,这是我将采用的方法,使用 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%,而不是 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])

获取输出中所需的额外列。

关于SQL Server SELECT 查询,行数据到列的转换(如 PIVOT),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10494383/

相关文章:

sql - 有没有一种方法可以防止重复调用 SQL 查询并进行缓存并加快速度?

c# - 在SQL中,如何将两列的数据乘以第三列

.net - 如何捕获死锁引起的SqlException?

ios - 如何访问 Parse 数据库中的指针值

sql - Oracle 中的 CREATE TABLE 逆向工程

sql-server - tsql 嵌套游标没有正确回滚继续

asp.net - 在需要将数据库流量保持在最低水平的情况下,存储调查的问题和答复的最佳方法是什么?

SQL 作业状态

java - MySQL 错误 - 不正确的 DOUBLE 值 : 'chests'

java - 从 Java 调用其中包含游标和时态表的 MS Sql 服务器存储过程?