SQL动态生成列:纵向数据转横向展示
需积分: 31 4 浏览量
更新于2024-10-18
收藏 5KB TXT 举报
在数据库管理中,有一个常见的需求是将纵向存储的表格数据转换成横向展示,以便于更直观地呈现和分析。这个问题涉及到的是数据库查询技术,特别是SQL Server中的动态SQL和Pivot操作。原始数据以表格形式存储,包含姓名、课程和分数,例如:
| 姓名 | 课程 | 分数 |
| --- | --- | --- |
| 张三 | 语文 | 74 |
| 张三 | 数学 | 83 |
| 张三 | 物理 | 93 |
| 李四 | 语文 | 74 |
| 李四 | 数学 | 84 |
| 李四 | 物理 | 94 |
目标是将其转换为如下格式:
| 姓名 | 语文 | 数学 | 物理 |
| --- | --- | --- | --- |
| 李四 | 74 | 84 | 94 |
| 张三 | 74 | 83 | 93 |
下面是实现这个目标的步骤和使用的SQL语句:
1. 创建表: 首先,我们需要创建一个表`tb`,如`CREATE TABLE tb (姓名 VARCHAR(10), γ VARCHAR(10), 分数 INT)`,其中`γ`用于表示不同的科目。
2. 插入数据: 使用`INSERT INTO`语句逐行插入数据。
3. 查询与动态SQL: SQL Server 2000及以下版本可以使用`GROUP BY`和CASE语句来实现。通过`GROUP BY`和CASE分别对姓名和科目进行分组并计算每个科目的最大值。代码如下:
```sql
SELECT 姓名,
MAX(CASE WHEN '' THEN 0 ELSE γ END) AS 语文,
MAX(CASE WHEN 'ѧ' THEN γ ELSE 0 END) AS 数学,
MAX(CASE WHEN '' THEN 0 ELSE γ END) AS 物理
FROM tb
GROUP BY 姓名;
```
4. SQL Server 2005及以上版本的Pivot操作: 对于SQL Server 2005及以上版本,可以使用`PIVOT`操作更为简洁地完成转换。首先,使用`SELECT DISTINCT γ`获取所有科目,然后构建动态的SQL字符串`@sql`,最后执行`APART`函数:
```sql
DECLARE @sql NVARCHAR(8000);
SELECT @sql = ISNULL(@sql + ',','') + γ
FROM (SELECT DISTINCT γ FROM tb) AS a;
EXEC('SELECT * FROM (SELECT * FROM tb) AS apivot(MAX() FOR γ IN (' + @sql + ')) AS b');
```
5. 结果展示: 结果显示为预期的横向格式,每行对应一个学生,各列分别为对应的科目和分数。
这些SQL语句展示了如何在不同版本的SQL Server中动态生成列,从纵向的表格数据转换为横向的数据展示,这对于数据分析和报告生成非常有用。
2009-08-13 上传
2022-08-03 上传
2019-04-03 上传
2011-05-19 上传
2019-10-10 上传
2021-06-07 上传
ylfyly
- 粉丝: 3
- 资源: 5
最新资源
- 火炬连体网络在MNIST的2D嵌入实现示例
- Angular插件增强Application Insights JavaScript SDK功能
- 实时三维重建:InfiniTAM的ros驱动应用
- Spring与Mybatis整合的配置与实践
- Vozy前端技术测试深入体验与模板参考
- React应用实现语音转文字功能介绍
- PHPMailer-6.6.4: PHP邮件收发类库的详细介绍
- Felineboard:为猫主人设计的交互式仪表板
- PGRFileManager:功能强大的开源Ajax文件管理器
- Pytest-Html定制测试报告与源代码封装教程
- Angular开发与部署指南:从创建到测试
- BASIC-BINARY-IPC系统:进程间通信的非阻塞接口
- LTK3D: Common Lisp中的基础3D图形实现
- Timer-Counter-Lister:官方源代码及更新发布
- Galaxia REST API:面向地球问题的解决方案
- Node.js模块:随机动物实例教程与源码解析