t-sql中pivot用法(行列转换)

本文展示了如何使用SQL的Pivot语法来聚合数据,并为特定学生在成绩表中的记录条数进行分组汇总。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

从另一张表找的3974行是张三,8319行是李四,3051行是王五;

从stu_score查id,stu_id两列,聚合求出 得出张三,李四,王五在stu_score中的记录条数 

复制代码
select [3974] as 张三, [8319] as 李四, [3051] as 王五
from 
(
select id,stu_id from stu_score) as s
pivot
(
    
count(id)
    
for stu_id in ([3974],[8319],[3051])
)
as pvt
复制代码

 

 T-SQL Pivot Syntax

SELECT

  [non-pivoted column], -- optional

  [additional non-pivoted columns], -- optional

  [first pivoted column],

  [additional pivoted columns]

FROM (

  SELECT query producing sql data for pivot

  -- select pivot columns as dimensions and

  -- value columns as measures from sql tables

) AS TableAlias

PIVOT

(

  <aggregation function>(column for aggregation or measure column) -- MIN,MAX,SUM,etc

  FOR [<column name containing values for pivot table columns>]

  IN (

    [first pivoted column], ..., [last pivoted column]

  )

) AS PivotTableAlias

 

复制代码
select exam_name as 考试名称, [407] as 一班, [408] as 二班, [409] as 三班, [415] as 九班
from
(
select dept_id, exam_name, [language] 
from stu_score,stu_studentinfo 
where stu_score.stu_id = stu_studentinfo.id) as t
pivot
(
    
avg([language])
    
for dept_id in ([407],[408],[409],[415])
)
as pvt
复制代码

结果如下:

考试名称一班二班三班九班
考试一89.2688.3390.3685.25
考试二82.2687.9880.3685.25
期末81.2683.3380.3678.25
### SQL中实现行列转换的方法及示例 在SQL Server中,`PIVOT` 和 `UNPIVOT` 是用于实现行列转换的两种重要工具。以下将详细介绍这两种方法,并提供具体示例。 #### 1. 使用 `PIVOT` 实现行转列 `PIVOT` 的主要作用是将行中的数据旋转为列名,通常需要结合聚合函数一起使用。其一般语法如下: ```sql SELECT <非透视列>, [第一列], [第二列], ... , [第n列] FROM (SELECT <非透视列>, <透视列>, <值列> FROM 源表) AS 源查询 PIVOT ( 聚合函数(值列) FOR 透视列 IN ([第一列], [第二列], ..., [第n列]) ) AS 透视表别名; ``` **示例:** 假设有一个学生课程成绩表 `StudentScores`,包含三列:`StudentID`, `Course`, 和 `Score`。我们希望将每个学生的课程成绩以列为单位展示。 ```sql CREATE TABLE StudentScores ( StudentID INT, Course VARCHAR(50), Score INT ); INSERT INTO StudentScores VALUES (1, '语文', 85); INSERT INTO StudentScores VALUES (1, '数学', 92); INSERT INTO StudentScores VALUES (1, '物理', 78); INSERT INTO StudentScores VALUES (2, '语文', 90); INSERT INTO StudentScores VALUES (2, '数学', 88); INSERT INTO StudentScores VALUES (2, '物理', 95); -- 使用 PIVOT 实现行转列 SELECT StudentID, [语文], [数学], [物理] FROM (SELECT StudentID, Course, Score FROM StudentScores) AS SourceTable PIVOT ( SUM(Score) FOR Course IN ([语文], [数学], [物理]) ) AS PivotTable; ``` 上述代码中,`SUM(Score)` 是聚合函数,用于对每门课程的成绩进行汇总[^1]。 --- #### 2. 使用 `UNPIVOT` 实现列转行 与 `PIVOT` 相反,`UNPIVOT` 将列中的数据旋转为行。它的语法如下: ```sql SELECT <非透视列>, <值列>, <透视列> FROM (SELECT <非透视列>, <列1>, <列2>, ..., <列n> FROM 源表) AS 源查询 UNPIVOT ( 值列 FOR 透视列 IN (<列1>, <列2>, ..., <列n>) ) AS 透视表别名; ``` **示例:** 假设有一个学生信息表 `StudentInfo`,其中包含学生的姓名和各科成绩。 ```sql CREATE TABLE StudentInfo ( StudentName VARCHAR(50), Chinese INT, Math INT, Physics INT ); INSERT INTO StudentInfo VALUES ('Alice', 85, 92, 78); INSERT INTO StudentInfo VALUES ('Bob', 90, 88, 95); -- 使用 UNPIVOT 实现列转行 SELECT StudentName, Subject, Score FROM (SELECT StudentName, Chinese, Math, Physics FROM StudentInfo) AS SourceTable UNPIVOT ( Score FOR Subject IN (Chinese, Math, Physics) ) AS UnpivotTable; ``` 上述代码中,`UNPIVOT` 将每一门课程的成绩从列转换为行[^3]。 --- #### 3. 在 SQL Server 2000 中的替代方案 在 SQL Server 2000 中,由于不支持 `PIVOT` 和 `UNPIVOT`,可以使用聚合函数和 `CASE` 语句来实现类似的功能。 **示例:** ```sql SELECT StudentID, MAX(CASE WHEN Course = '语文' THEN Score ELSE NULL END) AS 语文, MAX(CASE WHEN Course = '数学' THEN Score ELSE NULL END) AS 数学, MAX(CASE WHEN Course = '物理
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值