在 SQL Server 中,“行转列”是一个常见的数据处理需求,通常用于将多条记录的值转换为单行的列值。这在数据展示、报表生成等场景中非常有用。下面将详细介绍 SQL Server 中行转列的几种常见方法,并提供相应的代码示例。

方法一:使用 PIVOT

PIVOT 是 SQL Server 提供的一个强大功能,可以轻松实现行转列的效果。假设我们有一个销售表,表结构如下:

CREATE TABLE Sales (
    Year INT,
    Month INT,
    Amount DECIMAL(10, 2)
);

INSERT INTO Sales (Year, Month, Amount) VALUES 
(2023, 1, 1000.00),
(2023, 2, 1500.00),
(2023, 3, 1200.00),
(2023, 1, 900.00),
(2023, 2, 800.00);

我们想要将每个月的销售额转换为列,得到以下结果:

| Year | Jan | Feb | Mar | |------|--------|--------|--------| | 2023 | 1900.00| 2300.00| 1200.00|

可以使用 PIVOT 语句完成这个需求:

SELECT Year, 
       ISNULL([1], 0) AS Jan,
       ISNULL([2], 0) AS Feb,
       ISNULL([3], 0) AS Mar
FROM (
    SELECT Year, Month, SUM(Amount) AS TotalAmount
    FROM Sales
    GROUP BY Year, Month
) AS SourceTable
PIVOT (
    SUM(TotalAmount) 
    FOR Month IN ([1], [2], [3])
) AS PivotTable
ORDER BY Year;

方法二:使用 CASE 语句

除了使用 PIVOT,CASE 语句也是一种常见的行转列的方法。通过条件聚合,可以实现类似的效果,示例如下:

SELECT 
    Year,
    SUM(CASE WHEN Month = 1 THEN Amount ELSE 0 END) AS Jan,
    SUM(CASE WHEN Month = 2 THEN Amount ELSE 0 END) AS Feb,
    SUM(CASE WHEN Month = 3 THEN Amount ELSE 0 END) AS Mar
FROM Sales
GROUP BY Year
ORDER BY Year;

方法三:使用动态 SQL

在某些情况下,列的数量不固定(例如,月份可能是动态的),我们可以使用动态 SQL 来实现行转列。示例如下:

DECLARE @cols NVARCHAR(MAX), @query NVARCHAR(MAX);

SELECT @cols = STRING_AGG(QUOTENAME(Month), ',')
FROM (SELECT DISTINCT Month FROM Sales) AS Months;

SET @query = '
SELECT Year, ' + @cols + '
FROM (
    SELECT Year, Month, Amount
    FROM Sales
) AS SourceTable
PIVOT (
    SUM(Amount)
    FOR Month IN (' + @cols + ')
) AS PivotTable
ORDER BY Year;';

EXEC sp_executesql @query;

总结

行转列在 SQL Server 中是一个灵活又强大的功能,PIVOT 是最直接的方法,而 CASE 语句则提供了更多的自定义选项。当列的数量不易确定时,动态 SQL 是您可以考虑的方案。掌握这些方法将大大提升我们在数据处理和分析方面的能力。希望本文能对您在 SQL Server 的行转列操作中有所帮助。

点赞(0) 打赏

微信小程序

微信扫一扫体验

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部