Access开发培训
网站公告
·Access专家课堂QQ群号:151711184    ·Access快速开发平台下载地址及教程    ·欢迎加入Access专家课堂微信群!    ·如何快速搜索本站文章|示例|资料    
您的位置: 首页 > 技术文章 > Access数据库-查询/SQL语句

全面掌握MS ACCESS SQL(35)

时 间:2018-01-19 17:31:08
作 者:Big Young   ID:252  城市:襄阳
摘 要:    TRANSFORM语句实例详解。
正 文:

第二节 TRANSFORM语句实例详解

“交叉表”对象是一个网格,用来根据指定的条件返回值,数据显示在压缩行和列中。这种格式易于比较数据并辨别其趋势。它由三个元素组成:

行、列和摘要字段。

“交叉表”中的行沿水平方向延伸(从一侧到另一侧)。

“交叉表”中的列沿垂直方向延伸(上下)。

汇总字段位于行和列的交叉处。每个交叉处的值代表对既满足行条件又满足列条件的记录的汇总(求和、计数等)。

在说明如何用TRANSFORM语句来创建交叉表前我们还是先准备好示例数据。我们先创建一个交叉表查询示例数据库,在库中创建一个示例数据表,表名为成绩,内容如下:

姓名    科目    成绩

张三            语文            99

张三            数学            86

张三            英语            75

李四            语文            78

李四            数学            85

李四            英语            78

创建此表的相关SQL语句如下:

Create TABLE 成绩 (姓名 char(10), 科目 char(10), 成绩 int);

Insert INTO 成绩 (姓名,科目,成绩) VALUES ('张三','语文',99);

Insert INTO 成绩 (姓名, 科目, 成绩) VALUES ('张三','数学',86);

Insert INTO 成绩 (姓名, 科目, 成绩) VALUES ('张三','英语',75);

Insert INTO 成绩 (姓名, 科目, 成绩) VALUES ('李四','语文',78);

Insert INTO 成绩 (姓名, 科目, 成绩) VALUES ('李四','数学',85);

Insert INTO 成绩 (姓名, 科目, 成绩) VALUES ('李四','英语',78);

一、行列转换类型的交叉表

利用上面的数据表,我们想转换成如下的表格式:

姓名    语文    数学    英语

李四    78      85      78

张三    99      86      75

这其实就是一静态的交叉表,也就是说是一个列数固定的交叉表,这种情况其实只要一句简单的Select查询就可以搞定:

Select 姓名,SUM(IIF(a.科目='语文',成绩,NULL)) AS 语文,

            SUM(IIF(a.科目='数学',成绩,NULL)) AS 数学,

            SUM(IIF(a.科目='英语',成绩,NULL)) AS 英语

FROM 成绩 AS a

GROUP BY 姓名;

当要增加“总计”列:“总分”时,如下表所示:

姓名    语文    数学    英语    总分

李四    78      85      78      241

张三   99      86      75      260

只需增加SUM(a.成绩) AS 总分,完整的SQL语句如下:

Select 姓名,SUM(IIF(a.科目='语文',成绩,NULL)) AS 语文,

            SUM(IIF(a.科目='数学',成绩,NULL)) AS 数学,

            SUM(IIF(a.科目='英语',成绩,NULL)) AS 英语,

        SUM(a.成绩) AS 总分

FROM 成绩 AS a

GROUP BY 姓名;

其中利用了VBA函数IIF判断,如果是相应的列,则取需要统计的“成绩”的数值,否则取NULL,然后再合计。

这里有一点需要着重说明一下:此处用了NULL值而不是用0。这样安排是有道理的,假如用0,虽然求和函数SUM可以取到正确的数,但类似COUNT函数(取记录个数),结果就不对了,因为NULL不算一条记录,而0要算,同理空字串("")也是这样,总之在这里应该用NULL,这样任何函数都没问题。

二、利用ACCESS SQLTRANSFORM语句来实现行列转换

TRANSFORM SUM(成绩)

Select 姓名

FROM 成绩

GROUP BY 姓名

PIVOT 科目 IN (语文,数学,英语);

运行后的结果与前面的效果一样,如:

姓名    语文    数学    英语

李四    78      85      78

张三    99      86      75

上面的例子是列固定的,所以称为静态交叉表查询,我们也可以写成动态的交叉表查询,就是列会根据表中的数据自动分类确定列数的交叉表,如下所示:

姓名    科目    分数

张三    语文    99

张三    数学    86

张三    英语    75

李四    语文    78

李四    数学    85

李四    英语    78

王五    语文    92

王五    数学    90

王五    英语    89

张三    政治    97

张三    历史    98

张三    地理    80

李四    政治    85

李四    历史    99

李四    地理    88

王五    政治    94

王五    历史    92

王五    地理    96

TRANSFORM Sum(成绩.分数) AS 分数之合计

Select 成绩.姓名, Sum(成绩.分数) AS 总分

FROM 成绩

GROUP BY 成绩.姓名

ORDER BY 姓名 DESC

PIVOT 成绩.科目;

姓名    总分    地理    历史    数学    英语    语文    政治

张三    535     80      98      86      75      99      97

王五    553     96      92      90      89      92      94

李四    513     88      99      85      78      78      85

三、交叉表查询完整示例

行列转换并不是TRANSFORM语句的主要功能,其主要功能是创建交叉表查询,加强对数据的分析能力。交叉表查询可以“重构”汇总数据,使其更容易阅读和理解,它可以在一个查询中提供比汇总查询更多的汇总数据。交叉表查询计算总和、平均值、计数等,然后按照两组值对结果进行分组:一组值垂直分布在数据表的一侧,而另一组值水平分布在数据表的顶端。

比如一个存有销售合同记录的数据表,用交叉表查询可以一次汇总出每月或每季度的销售签订数据,而用汇总查询一般一次只能汇总一个月、一个季度的销售合同数据。

合同号  登记日期    登记人  签订日期    签订部门    签订人  合同名称    客户    合同额  合同份数    合同负责人  备注

12001   2007-07-16  王先生  2005-05-12  销售一部    王先生  商品销售合同    北京某科技公司    41,500.00 2   张三   

12002   2007-07-15  王先生  2005-07-15  销售二部    王先生  销售合同1002    大连海洋公司    71,000.00 1   张三   

12003   2007-07-15  李先生  2006-07-15  销售一部    李先生  销售合同12003   上海某科技公司    254,000.00    1   张三   

12004   2007-07-15  李四    2006-07-15  销售二部    李先生  销售合同12004   北京某科技公司    190,000.00    1   张三   

12005   2007-07-15  李四    2007-07-15  销售一部    李先生  销售合同12005   石家庄某公司    64,000.00 1   张三   

12006   2007-07-15  李四    2007-07-15  销售二部    李先生  销售合同12006   牡丹江某公司    194,000.00    1   张三   

SQL语句如下:

TRANSFORM Sum(合同额) AS 合同额之总计

Select 签订部门, Sum(合同额) AS [总计 合同额]

FROM 销售合同

GROUP BY 签订部门

PIVOT Year([签订日期]) & "" & Format([签订日期],"mm") & "";

运行结果如下:

签订部门    总计 合同额 200505 200507 200607 200707

销售一部    ¥359,500.00 ¥41,500.00      ¥254,000.00 ¥64,000.00

销售二部    ¥455,000.00     ¥71,000.00  ¥190,000.00 ¥194,000.00

这样汇总数据就比较清晰了。



Access软件网官方交流QQ群 (群号:483923997)       Access源码网店

常见问答:

技术分类:

相关资源:

专栏作家

关于我们 | 服务条款 | 在线投稿 | 友情链接 | 网站统计 | 网站帮助