SQL行转列示例:面试与统计查询的经典问题
需积分: 9 36 浏览量
更新于2024-09-15
收藏 2KB TXT 举报
"这篇文章主要介绍了如何在SQL中实现行列互换的操作,以及提供了一个在SQL Server中合并字符串的函数示例。"
在SQL中,有时我们需要将数据表的行和列进行转换,以便于数据分析或者特定的统计查询。标题中的"sql行列互换"就是指的这种操作。在描述中提到,这样的技巧可能在面试中也会被问到,因此对于SQL开发者来说,掌握这种技术是很有价值的。
以下是一个示例,展示了如何在SQL Server中将表格的行和列互换:
首先,我们有一个名为`tbltest1`的表,其中包含两列:`student`(学生)和`kemu`(科目),以及对应的分数`fenshu`。例如:
```
student | kemu | fenshu
--------|--------|------
student1| ѧ | 90
student1| Ӣ | 85
student2| ѧ | 92
student2| Ӣ | 82
```
要实现行列互换,我们可以利用SQL Server的动态SQL来实现。这里首先声明一个变量`@sql`来构建SQL语句。遍历`kemu`的所有唯一值,然后构造一个`CASE`表达式,根据科目`kemu`来计算每个学生的总分。最后,执行动态SQL得到结果:
```sql
DECLARE @sql VARCHAR(4000)
SET @sql = 'SELECT student'
SELECT @sql = @sql + ', SUM(CASE kemu WHEN ''' + kemu + ''' THEN fenshu ELSE 0 END) [' + kemu + ']'
FROM (SELECT DISTINCT kemu FROM tbltest1) AS a
SET @sql = @sql + ' FROM tbltest1 GROUP BY student'
EXEC (@sql)
```
执行这段代码后,我们将得到一个新的视图,其中行变成了学生,列变成了科目,而每个单元格则是对应学生在该科目的分数。
此外,文件还提到了一个在SQL Server中合并字符串的示例。创建一个名为`fliehebin`的用户定义函数,它接受一个`id`作为输入,然后返回该`id`下所有`strings`列的值连接成的单个字符串。这样,如果`tbltest2`有如下数据:
```
id | strings
---|--------
1 | my
1 | name
1 | is
1 | xudayu
2 | hello
2 | world
```
通过调用`dbo.fliehebin(id)`,我们可以得到:
```
id | dbo.fliehebin(id)
---|-------------------
1 | mynameisxudayu
2 | helloworld
```
请注意,这个功能在MySQL或Oracle中可能需要使用不同的方法来实现,因为它们的字符串处理函数可能有所不同。
SQL中的行列互换是一种重要的数据处理技巧,可以极大地帮助我们在分析数据时以更方便的形式展示结果。而合并字符串的功能则有助于将多个行数据整合成单行,便于进一步处理或展示。这两个示例展示了SQL在处理复杂数据操作时的灵活性。
2011-03-09 上传
2010-12-31 上传
2012-03-23 上传
RonnyJing
- 粉丝: 0
- 资源: 11