SQL Server 中行转列

打印 上一主题 下一主题

主题 996|帖子 996|积分 2998

        在 SQL Server 数据库中,行转列在实践中是一种非常有效,可以将原本以行形式存储的数据转换为列的形式,以便更好地进行数据分析和报表展示。本文将深入浅出地介绍 SQL Server 中的行转列技能,并以数据表中的时间数据为例进行详细讲解。
一、为什么必要行转列

        在实际的数据分析和报表制作过程中,我们经常会遇到必要将行数据转换为列数据的情况。例如,在一个贩卖数据表中,我们大概必要将不同月份的贩卖数据转换为列,以便更好地比较不同月份的贩卖情况。行转列技能可以资助我们轻松地实现这种数据转换,提高数据分析的效率和准确性。

二、行转列的基本概念

        行转列,顾名思义,就是将表中的行数据转换为列数据。在 SQL Server 中,可以使用 PIVOT 运算符或者 CASE WHEN 语句来实现行转列。

三、使用 PIVOT 运算符进行行转列


  • 创建示例数据表并插入数据
  1. CREATE TABLE SalesData
  2. (
  3.     SalesID INT PRIMARY KEY,
  4.     SalesDate DATE,
  5.     SalesAmount DECIMAL(10, 2)
  6. );
  7. INSERT INTO SalesData VALUES (1, '2023-01-01', 1000);
  8. INSERT INTO SalesData VALUES (2, '2023-02-01', 1500);
  9. INSERT INTO SalesData VALUES (3, '2023-03-01', 1200);
复制代码
      2.使用 PIVOT 运算符进行行转列 
  1. SELECT *
  2. FROM
  3. (
  4.     SELECT SalesDate, SalesAmount, DATEPART(MONTH, SalesDate) AS Month
  5.     FROM SalesData
  6. ) AS SourceData
  7. PIVOT
  8. (
  9.     SUM(SalesAmount)
  10.     FOR Month IN ([1], [2], [3])
  11. ) AS PivotTable;
复制代码
在上述代码中,我们首先从贩卖数据表中选择贩卖日期、贩卖金额和贩卖日期的月份作为源数据。然后,使用 PIVOT 运算符将月份列的值转换为列,对贩卖金额进行求和操纵。末了,选择转换后的列和贩卖日期作为结果集。
解释:


  • PIVOT 运算符必要指定一个聚合函数,这里我们使用 SUM 函数对贩卖金额进行求和。
  • FOR Month IN ([1], [2], [3]) 指定了要转换为列的月份值,可以根据实际情况进行调整。
四、使用 CASE WHEN 语句进行行转列


  • 使用 CASE WHEN 语句进行行转列
    1. SELECT SalesDate,
    2.        SUM(CASE WHEN DATEPART(MONTH, SalesDate) = 1 THEN SalesAmount END) AS Month1SalesAmount,
    3.        SUM(CASE WHEN DATEPART(MONTH, SalesDate) = 2 THEN SalesAmount END) AS Month2SalesAmount,
    4.        SUM(CASE WHEN DATEPART(MONTH, SalesDate) = 3 THEN SalesAmount END) AS Month3SalesAmount
    5. FROM SalesData
    6. GROUP BY SalesDate;
    复制代码
    在上述代码中,我们使用 CASE WHEN 语句根据贩卖日期的月份将贩卖金额转换为不同的列。然后,使用 SUM 函数对转换后的列进行求和操纵,并按照贩卖日期进行分组。
  • 使用 CASE WHEN 语句必要根据实际情况编写多个 CASE WHEN 子句,比较繁琐。但是,它可以在不支持 PIVOT 运算符的数据库中使用。
五、动态行转列


在实际应用中,我们大概不知道数据表中的月份数量,这时间就必要使用动态 SQL 来实现动态行转列。


  • 动态行转列的示例代码
  1. DECLARE @columns NVARCHAR(MAX), @sql NVARCHAR(MAX);
  2. -- 构建列名列表
  3. SELECT @columns = STUFF((SELECT DISTINCT ',' + QUOTENAME(CONVERT(VARCHAR(2), DATEPART(MONTH, SalesDate)))
  4.                           FROM SalesData
  5.                           FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '');
  6. -- 构建动态 SQL
  7. SET @sql = N'SELECT SalesDate, ' + @columns + '
  8.             FROM
  9.             (
  10.                 SELECT SalesDate, SalesAmount, CONVERT(VARCHAR(2), DATEPART(MONTH, SalesDate)) AS Month
  11.                 FROM SalesData
  12.             ) AS SourceData
  13.             PIVOT
  14.             (
  15.                 SUM(SalesAmount)
  16.                 FOR Month IN (' + @columns + ')
  17.             ) AS PivotTable;';
  18. -- 执行动态 SQL
  19. EXEC sp_executesql @sql;
复制代码
在上述代码中,我们首先使用 FOR XML PATH 和 STUFF 函数构建了一个包含全部月份值的列名列表。然后,构建动态 SQL 语句,并使用 sp_executesql 存储过程执举措态 SQL。
解释:


  • 动态行转列必要使用动态 SQL,这大概会带来一些性能问题。因此,在实际应用中,应该只管制止使用动态行转列,除非确实必要。
六、总结

行转列是 SQL Server 中一项非常有效的技能,可以将表中的行数据转换为列数据,以便更好地进行数据分析和报表展示。本文以数据表中的时间数据为例,介绍了使用 PIVOT 运算符和 CASE WHEN 语句进行行转列的方法,以及动态行转列的实现。希望本文对你在 SQL Server 中的数据处置处罚工作有所资助。


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

泉缘泉

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表