PIVOT 是 SQL Server 中的一个功能,用于将行转换为列。然而,MySQL 和 Oracle 不直接支持 PIVOT 语法。但是,你可以使用条件聚合或其他技术来模拟 PIVOT 的行为。
语法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | SELECT ...
FROM
(
SELECT ...
FROM <source_table>
) AS SourceTable
PIVOT
(
aggregate_function(<column_value>)
FOR <column_name>
IN ([first_pivoted_column], [second_pivoted_column], ...)
) AS PivotTable;
|
以下是如何在 SQL Server、MySQL 和 Oracle 中实现类似 PIVOT 的操作的示例。
1. SQL Server
假设你有一个名为 sales 的表,其中包含 year, product, 和 amount 三个字段:
sql:
1 2 3 4 5 6 7 8 9 10 11 | CREATE TABLE sales (
year INT ,
product VARCHAR (50),
amount DECIMAL (10, 2)
);
INSERT INTO sales ( year , product, amount) VALUES
(2020, 'A' , 100),
(2020, 'B' , 200),
(2021, 'A' , 150),
(2021, 'B' , 250);
|
你可以使用 PIVOT 来转换数据:
1 2 3 4 5 6 7 8 9 | SELECT *
FROM (
SELECT year , product, amount
FROM sales
) AS source_table
PIVOT (
SUM (amount)
FOR product IN ([A], [B])
) AS pivot_table;
|
这将返回:
year | A | B |
---|
2020 | 100.0 | 200.0 |
2021 | 150.0 | 250.0 |
2. MySQL
在 MySQL 中,你可以使用条件聚合来模拟 PIVOT:
1 2 3 4 5 | SELECT year ,
SUM ( CASE WHEN product = 'A' THEN amount ELSE 0 END ) AS 'A' ,
SUM ( CASE WHEN product = 'B' THEN amount ELSE 0 END ) AS 'B'
FROM sales
GROUP BY year ;
|
这将返回与 SQL Server 相同的结果。
3. Oracle
在 Oracle 中,你也可以使用条件聚合:
1 2 3 4 5 | SELECT year ,
SUM ( CASE WHEN product = 'A' THEN amount ELSE 0 END ) AS "A" ,
SUM ( CASE WHEN product = 'B' THEN amount ELSE 0 END ) AS "B"
FROM sales
GROUP BY year ;
|
这将返回与 SQL Server 和 MySQL 相同的结果。
请注意,虽然上述查询在逻辑上模拟了 PIVOT 的行为,但它们并不是真正的 PIVOT 语法。如果你需要在多个列或动态列上进行转换,那么你可能需要构建更复杂的查询或使用存储过程来动态生成 SQL。