在数据处理领域,有时需要将数据重塑成更易于用户使用或更方便分析的格式。实现此目标最常用的技术之一是透视,其中数据被转换为更宽的布局。虽然透视通常涉及聚合值,但也可以在不使用任何聚合函数的情况下执行此操作。
考虑下表:
<code class="language-sql">CREATE TABLE Data ( CustomerID int, DBColumnName varchar(50), Data varchar(50) ); INSERT INTO Data (CustomerID, DBColumnName, Data) VALUES (1, 'FirstName', 'Joe'), (1, 'MiddleName', 'S'), (1, 'LastName', 'Smith'), (1, 'Date', '12/12/2009'), (2, 'FirstName', 'Sam'), (2, 'MiddleName', 'S'), (2, 'LastName', 'Freddrick'), (2, 'Date', '1/12/2009'), (3, 'FirstName', 'Jaime'), (3, 'MiddleName', 'S'), (3, 'LastName', 'Carol'), (3, 'Date', '12/1/2009');</code>
此表包含多个客户的数据,其中每条记录代表一个特定属性(FirstName、MiddleName、LastName、Date)及其关联的值。目标是将此数据透视成更易读的格式:
<code class="language-sql">CREATE TABLE PivotedData ( CustomerID int, FirstName varchar(50), MiddleName varchar(50), LastName varchar(50), Date varchar(50) ); INSERT INTO PivotedData (CustomerID, FirstName, MiddleName, LastName, Date) VALUES (1, 'Joe', 'S', 'Smith', '12/12/2009'), (2, 'Sam', 'S', 'Freddrick', '1/12/2009'), (3, 'Jaime', 'S', 'Carol', '12/1/2009');</code>
需要注意的是,此转换不聚合数据。相反,它保留了每个客户每个属性的唯一值。
为了在不使用聚合函数的情况下实现此转换,我们可以在分组的 SELECT 语句中使用 CASE 表达式:
<code class="language-sql">SELECT CustomerID, MIN(CASE DBColumnName WHEN 'FirstName' THEN Data END) AS FirstName, MIN(CASE DBColumnName WHEN 'MiddleName' THEN Data END) AS MiddleName, MIN(CASE DBColumnName WHEN 'LastName' THEN Data END) AS LastName, MIN(CASE DBColumnName WHEN 'Date' THEN Data END) AS Date FROM Data GROUP BY CustomerID;</code>
此查询使用一系列 CASE 表达式有条件地为每个客户选择与每个属性关联的值。MIN() 函数用于检索满足指定条件的单个值,确保我们每个属性只包含一个值。通过按 CustomerID 分组结果,我们为每个客户创建一行,其中包含其相应的属性和值。
此技术允许灵活地透视数据,而无需使用聚合函数。当数据需要最小转换并且需要保留原始值时,它特别有用。
以上是如何在不使用聚合函数的情况下透视表?的详细内容。更多信息请关注PHP中文网其他相关文章!