Sql pivot函数(利用Pivot函数实现数据透视表)

2冷心冷面 85次浏览

最佳答案利用Pivot函数实现数据透视表 数据透视表是一种非常常见的数据统计和分析工具,可以将大量数据以较为直观的形式呈现出来,方便用户进行分析。在Sql中,可以利用Pivot函数很方便地...

利用Pivot函数实现数据透视表

数据透视表是一种非常常见的数据统计和分析工具,可以将大量数据以较为直观的形式呈现出来,方便用户进行分析。在Sql中,可以利用Pivot函数很方便地实现数据透视表的功能,本文将从三个方面介绍该函数的使用。

基本语法

在使用Pivot函数时,首先需要了解其基本语法。以下是一般情况下的语法:

``` SELECT column_list [FOR pivot_column_list] PIVOT ( aggregate_function (value_column) FOR pivot_column IN ( column_list ) ) [ORDER BY column_list] ```

其中,column_list表示需要结果集中所包含的列名,value_column表示需要进行聚合运算的列名,pivot_column表示需要进行透视的列名,aggregate_function表示聚合函数,如SUM、AVERAGE等。

透视单列

在透视单列时,只需将pivot_column_list参数省略即可。以下示例演示了如何将一个学生的每个成绩转化为一行:

``` CREATE TABLE st ( name VARCHAR(10), subject VARCHAR(10), score INT ); INSERT INTO st VALUES ( 'Tom', 'Math', 90 ); INSERT INTO st VALUES ( 'Tom', 'Chinese', 85 ); INSERT INTO st VALUES ( 'Tom', 'English', 70 ); INSERT INTO st VALUES ( 'Jerry', 'Math', 88 ); INSERT INTO st VALUES ( 'Jerry', 'Chinese', 82 ); INSERT INTO st VALUES ( 'Jerry', 'English', 95 ); SELECT name, [Math], [Chinese], [English] FROM st PIVOT ( AVG(score) FOR subject IN ([Math], [Chinese], [English]) ) AS pvt ```

运行该语句后,我们将得到如下结果:

``` name Math Chinese English Tom 90 85 70 Jerry 88 82 95 ```

可以看到,我们成功地将每个学生的每个成绩转化为了一行。

透视多列

在透视多列时,需要将pivot_column_list参数设置为两个或的列名。以下示例演示了如何将一个部门的每个员工的每个月工资转化为一行:

``` CREATE TABLE salary ( department VARCHAR(10), name VARCHAR(10), month VARCHAR(10), salary INT ); INSERT INTO salary VALUES ( 'Sales', 'Tom', 'Jan', 2000 ); INSERT INTO salary VALUES ( 'Sales', 'Tom', 'Feb', 2500 ); INSERT INTO salary VALUES ( 'Sales', 'Tom', 'Mar', 2800 ); INSERT INTO salary VALUES ( 'Sales', 'Jerry', 'Jan', 2200 ); INSERT INTO salary VALUES ( 'Sales', 'Jerry', 'Feb', 2300 ); INSERT INTO salary VALUES ( 'Sales', 'Jerry', 'Mar', 2400 ); SELECT department, name, [Jan], [Feb], [Mar] FROM salary PIVOT ( AVG(salary) FOR month IN ([Jan], [Feb], [Mar]) ) AS pvt ```

运行该语句后,我们将得到如下结果:

``` department name Jan Feb Mar Sales Jerry 2200 2300 2400 Sales Tom 2000 2500 2800 ```

在该示例中,我们设置了两个透视列,department和name,成功地将一个部门的每个员工的每个月工资转化为了一行。

使用动态列

在一些情况下,透视列不是固定的,需要使用动态列。以下示例演示了如何将一个部门的每个员工的每个月工资转化为一行,但透视列不是固定的,而是根据月份动态生成:

``` DECLARE @cols AS NVARCHAR(MAX), @query AS NVARCHAR(MAX); SET @cols = STUFF((SELECT distinct ',' + QUOTENAME(month) FROM salary FOR XML PATH(''), TYPE ).value('.', 'NVARCHAR(MAX)') ,1,1,'') SET @query = 'SELECT department, name, ' + @cols + ' from ( select department, name, month, salary from salary ) x pivot ( avg(salary) for month in (' + @cols + ') ) p ' EXECUTE(@query) ```

运行该语句后,我们将得到和上一示例相同的结果。

在示例中,首先我们使用了STUFF函数和FOR XML PATH函数生成一个动态列的列表,然后使用EXECUTE函数执行包含动态列定义的SQL语句。在使用动态列时需注意,动态列的数量不宜太大,否则可能会影响查询性能。

总结

本文介绍了如何使用Sql中的Pivot函数实现数据透视表的功能。通过基本语法、透视单列、透视多列和使用动态列等四个方面的示例,希望读者可以尽快掌握该函数的使用,为数据分析和统计工作提供便利。