ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 4017|回复: 9

【已解决】关于SQL中域聚合函数DSUM的困惑

[复制链接]

TA的精华主题

TA的得分主题

发表于 2014-3-6 19:23 | 显示全部楼层 |阅读模式
本帖最后由 张文洲 于 2014-3-24 10:33 编辑

各位老师好
最近在学习SQL技术,在研究论坛中“SQL转置九式”和“疑难千寻千解丛书之SQL完全应用”疑难97时,都碰到了DSUM函数在SQL中的应用。有不解之处,望有大神能指点迷津。
转置.rar (7.32 KB, 下载次数: 26)
疑难97.rar (88.81 KB, 下载次数: 30)
以下是有关内容:
一、SQL转置九式之一:如何将表格1转换为表格2的样式
表格1:
1.jpg
表格2:
2.jpg
使用的SQl语句是

TRANSFORM LAST(值)
SELECT NULL FROM
(SELECT F1 AS 值,DSUM("1","数据$","F1&F2<='"&F1&F2&"'") AS 列 from [数据$]
UNION ALL
SELECT F2 AS 值,DSUM("1","数据$","F1&F2<='"&F1&F2&"'")+0.1 AS 列 from [数据$])
GROUP BY NULL
PIVOT 列

我用公式计算   A1&B1<=A1:A28&B1:B28  的个数结果  与查询得到的次数并不相同  每一个都不相同,不知道是什么原因

二、如何根据表3查询分类累计数如表4
表3:
3.jpg
表4:
4.jpg
使用的SQl语句是:
SELECT 门店, 商品编码, 销售额, DSUM("销售额","销售表$","商品编码= '" & 商品编码 & "  'AND 门店<= '" & 门店 & "'") AS 累计销售额
FROM [销售表$]
ORDER BY 商品编码, 门店
对于两处示例中DSUM函数后面的条件   <=  无法理解其含义,求大神解惑
如果能说明一下DSUM函数的运行机制或流程,就更好了。









评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2014-3-20 14:54 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
为了方便理解,我重新模拟一个进行分析。
备注:
第三参数中,如变量字段为文本类型,
则表达式须使用单引号括住,如:职务='"&职务&"'
若表达式为日期/时间类型,则表达式前需使用#,如:日期=#"&日期&"#
如表达式为数值类型,则无须使用任何符合,如:数量="&数量&"
注意:域聚合函数中,每个参数需要使用单引号或双引号括住。单引号和双引号是等价的,并且成对出现。但是,个人建议用双引号括住参数,用单引号表示文本。

模拟分析过程:
模拟过程.PNG

域聚合函数运算.rar

17.83 KB, 下载次数: 67

点评

见老师详细解释,恍然大悟  发表于 2014-3-20 15:14

评分

3

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-3-20 15:16 | 显示全部楼层
wuxiang_123 发表于 2014-3-20 14:54
为了方便理解,我重新模拟一个进行分析。
备注:
第三参数中,如变量字段为文本类型,

非常感谢老师的耐心讲解,经指点,我恍然大悟。
之前无法理解DSUM函数的运行机制,原来会生成一个新表,再与原数据表进行交叉连接,再进行筛选统计。
由此一例,可以顺利理解其他聚合函数了。

TA的精华主题

TA的得分主题

发表于 2014-3-23 09:37 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
张文洲 发表于 2014-3-20 15:16
非常感谢老师的耐心讲解,经指点,我恍然大悟。
之前无法理解DSUM函数的运行机制,原来会生成一个新表, ...

我也在学这一块遇到这种问题。没理解DSUM的意思。谢谢了,有点明白了。

TA的精华主题

TA的得分主题

发表于 2015-9-2 10:07 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
张文洲 发表于 2014-3-20 15:16
非常感谢老师的耐心讲解,经指点,我恍然大悟。
之前无法理解DSUM函数的运行机制,原来会生成一个新表, ...

老师您好,我还是没有理解“<=  ”这个含义,根据“”wuxiang_123 “版主的详细分析中,第二步进行循环比较的过程中,用DSUM生成的新字段与主表的新字段循环比较,但是:字符串是怎么比较大小的?比如第二次循环的时候:”会计A(DSUM生成的新字段的值)   >=    会计B(主表中生成的新字段)“为”TRUE“  我就是想请教这个为什么就是”TRUE“ ?真没有搞明白?请老师解惑,在此表示感谢!

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-9-2 10:49 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
duquancai 发表于 2015-9-2 10:07
老师您好,我还是没有理解“=    会计B(主表中生成的新字段)“为”TRUE“  我就是想请教这个为什么就 ...

字符串也有大小之分,你可以在excel中计算看看

TA的精华主题

TA的得分主题

发表于 2015-9-2 11:15 | 显示全部楼层
张文洲 发表于 2015-9-2 10:49
字符串也有大小之分,你可以在excel中计算看看

DSUM("销售额","销售表$","商品编码= '" & 商品编码 & "  'AND 门店<= '" & 门店 & "'") ,就是说:有这个条件:'AND 门店<= '" & 门店 & "'"         就能累计?实在是没有搞明白!老师您好,能说详细一点吗?真的感谢啦!

TA的精华主题

TA的得分主题

发表于 2015-9-4 22:07 | 显示全部楼层
duquancai 发表于 2015-9-2 10:07
老师您好,我还是没有理解“=    会计B(主表中生成的新字段)“为”TRUE“  我就是想请教这个为什么就 ...

果比较字符串的大小,则比较的是字符的ASCII编码的大小。

在比较时,设置一个计数器,从零开始,一直循环到最短的那个字符结束,一位一位进行比较,

1.如果 字符串1的第n位的ASCII码值 等于 字符串2的第n位的ASCII码值
则 继续比较下一位
2.如果 字符串1的第n位的ASCII码值 大于 字符串2的第n位的ASCII码值
则 输出结果:1,表示字符串1 > 字符串2;
3.如果 字符串1的第n位的ASCII码值 小于 字符串2的第n位的ASCII码值
则 输出结果:-1 表示字符串1 < 字符串2;
4.如果 每一位的ASCII码值都相等,而且长度相同,
则 输出结果:0 表示字符串1 == 字符串2;
5.如果 字符串1是字符串2的前m位,例如 abcd 与abcdef 比较,
则 字符串1<字符串2.
原因是,到第5位时,字符串1的ASCII值是0,而字符串2的ASCII值为'e',即十进制的101,当然是字符串2大了.


具体到 cds和lesoqd

从第一位开始,'c'和'l'比较,当然是'c' < 'l'了,所以,"cds" < "lesoqd"
常用的几位ascii的顺序从小到大为:

0..9, A..Z, a..z.

TA的精华主题

TA的得分主题

发表于 2015-9-4 23:10 | 显示全部楼层
hope9966 发表于 2015-9-4 22:07
果比较字符串的大小,则比较的是字符的ASCII编码的大小。

在比较时,设置一个计数器,从零开始,一直循环 ...

谢谢解释字符串比较大小,很详细!但是感觉域聚合函数Dsum中的条件,并非是通过字符比较大小而得到“true”或者“false”来累加的。比如:上面提到的Dsum函数的条件,商品编码= '" & 商品编码 & "  'AND 门店<= '" & 门店 & "'   ,如果是通过字符比较大小而得到“true”或者“false”来累加的话,字段“门店”下面的各个具体“店埔”也是进行比较字符串大小吗?

TA的精华主题

TA的得分主题

发表于 2015-9-5 12:00 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 hope9966 于 2015-9-5 12:08 编辑
duquancai 发表于 2015-9-4 23:10
谢谢解释字符串比较大小,很详细!但是感觉域聚合函数Dsum中的条件,并非是通过字符比较大小而得到“true ...

我的理解,参考,不准标:
这个案例,商品编码相同条件下,门店有4个,  
由于组成‘门店’的汉字不同,二进制编码一定有大小之分,
      "商品编码= '" & 商品编码 & "  'AND 门店<= '" & 门店 & "'"
这样比较大小后,最大的返回4个true,最小的返回1个true
     DSUM("销售额","销售表$","商品编码= '" & 商品编码 & "  'AND 门店<= '" & 门店 & "'")
最大的返回4个true,即‘商品编码’相同的4个‘销售额’相加,DSUM返回这个相加值,成为“累计”字段的一项,对应二进制最大‘门店’这条记录。
同理:
最小的返回1个true,即‘商品编码’相同的,只满足相等条件的本身对应‘销售额’,DSUM返回这个值,成为“累计”字段的一项,对应二进制最小‘门店’这条记录。
同理:’门店‘第二大,第三大,由于二进制编码一定有大小之分,会返回3个true,2个true
最后通过:ORDER BY 商品编码,门店
让同一编码下,二进制码最小的先输出,给人一种累加的印像。
(如果还是不明白,哪么,你不需要知道‘门店’是怎么比较大小的,你只要知道,它们不相同,一定有大有小,并且不相等,大小就有顺序)
如果改成子查询你看可以更好的理解:
select 门店,商品编码,销售额,
   (select sum(b.销售额) from [销售表$]b where b.商品编码=a.商品编码 and b.门店<=a.门店)
from [销售表$]a order by 商品编码,门店
  

评分

1

查看全部评分

您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-4-27 16:53 , Processed in 0.055925 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表