SQL行转列示例:面试与统计查询的经典问题

需积分: 9 4 下载量 79 浏览量 更新于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在处理复杂数据操作时的灵活性。