首页 > 数据库 > mysql教程 > 如何在 SQL Server 2005 中透视列数未知的数据?

如何在 SQL Server 2005 中透视列数未知的数据?

Patricia Arquette
发布: 2025-01-13 07:24:42
原创
891 人浏览过

How to Pivot Data with an Unknown Number of Columns in SQL Server 2005?

SQL Server 2005 中处理未知列数的数据透视

本文探讨在 SQL Server 2005 中处理未知列数数据的透视难题。给定的数据集包含表示作业和成绩的变量列,期望的输出是一个透视表,包含作业列和学生总分。

由于 SQL Server 2005 的限制,此任务无法使用纯 SQL(无动态 SQL)解决方案。正如建议的答案中提到的,动态 SQL 提供了一种根据当前数据动态生成必要语句的方法。

例如,如果名为 Assignments 的表包含作业名称和截止日期:

<code class="language-sql">CREATE TABLE Assignments (
  ID int NOT NULL,
  AssignmentName varchar(50) NOT NULL,
  DueDate datetime
);</code>
登录后复制

以及数据:

<code class="language-sql">INSERT INTO Assignments (ID, AssignmentName, DueDate) VALUES (1, 'Assignment 1', '2023-03-01'), (2, 'Assignment 2', '2023-04-01'), (3, 'Assignment 3', '2023-05-01');</code>
登录后复制

可以使用以下动态 SQL 生成所需的输出:

<code class="language-sql">DECLARE @cols AS NVARCHAR(MAX),
        @query AS NVARCHAR(MAX);

SET @cols = (SELECT STUFF((
  SELECT ',[' + AssignmentName + ']'
  FROM Assignments
  FOR XML PATH(''), TYPE
), 1, 1, ''));

SET @query = 'SELECT
  StudentName,
  ' + @cols + ',
  SUM(Grade) OVER (PARTITION BY StudentName) AS Total
FROM
  (SELECT
    StudentName,
    AssignmentName,
    CASE WHEN AssignmentName = ''Total'' THEN NULL ELSE Grade END AS Grade
  FROM
    YourTable) AS t
PIVOT
  (MAX(Grade)
  FOR AssignmentName IN (' + @cols + ')) AS pvt';

EXECUTE(@query);</code>
登录后复制

这将创建一个包含作业列和学生总分的透视表,并按截止日期排序(如果表中存在 DueDate 列)。

以上是如何在 SQL Server 2005 中透视列数未知的数据?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板