ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 请老师解析SQL语句

[复制链接]

TA的精华主题

TA的得分主题

 楼主| 发表于 2017-8-17 15:42 | 显示全部楼层
  1. SELECT 门店, 商品编码, 销售额, DSUM("销售额","销售表$","商品编码= '" & 商品编码 & "' AND 门店<= '" & 门店 & "'") AS 累计销售额
  2. FROM [销售表$]
  3. ORDER BY 商品编码, 门店
复制代码
等效于?
  1. SELECT 门店, 商品编码, 销售额,sum(销售额) as 累计销售额 from [销售表$]  
  2. where 商品编码= '" & 商品编码 & "'AND 门店<='" & 门店 & "'
  3. GROUP BY 商品编码,门店
复制代码
但是下面的代码不能运行。错在哪儿呢?

TA的精华主题

TA的得分主题

 楼主| 发表于 2017-8-17 15:55 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册

感谢hope9966老师

本帖最后由 autumnalRain 于 2017-8-17 16:46 编辑

等效于下面代码(经测试)
  1. Select 门店,商品编码,销售额,
  2.    (select sum(b.销售额)  from [销售表$]b where b.商品编码=a.商品编码 and b.门店<=a.门店) AS 累计销售额
  3. from [销售表$]a
  4. order by 商品编码,门店
复制代码

原帖http://club.excelhome.net/thread-1100847-1-1.html

hope9966老师解释如下:

这个案例,商品编码相同条件下,门店有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 商品编码,门店
  

配图理解.png

TA的精华主题

TA的得分主题

发表于 2017-8-19 15:37 | 显示全部楼层
本帖最后由 jiangxiaoyun 于 2017-8-19 15:46 编辑

QQ截图20170819151946.png
代码1:
SELECT a.门店, a.商品编码, a.销售额, sum(b.销售额) AS 累计销售额  FROM [销售表$] a inner join [销售表$] b on a.商品编码=b.商品编码 and b.门店<= a.门店  group by  a.门店,a.商品编码,a.销售额 order by a.商品编码, a.门店
代码2:
Select 门店,商品编码,销售额,
   (select sum(b.销售额)  from [销售表$]b where b.商品编码=a.商品编码 and b.门店<=a.门店) AS 累计销售额
from [销售表$]a
order by 商品编码,门店


楼主显然是懂VBA的,SQL语句在执行的时候,也是全表扫描(循环),上述代码,显然是两个一模一样的表在对比数据。
一个表匹配另外一个表的数据(尽管两个表一模一样)
对比的条件是:商品编码相同的,门店不同的,一个表在另一个表中遍历循环查找。
以A001为例子,4个不同的门店,门店尽管是文本,但也是可以比较大小的。
如果还不明白,就姑且将这四个门店,以人工的方式,分为1234,4个等级的大小。
这样门店的规模就清晰了,谁的门店大,谁的门店小就清楚了。b.门店<=a.门店做的就是这样的事情。
我以为这例子,应当以同一个商品编码(内),以销售额的大小(排序比较)来进行累加更加合理。
以上,都是我瞎编的。

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2017-8-19 17:22 | 显示全部楼层
本帖最后由 autumnalRain 于 2017-8-19 17:37 编辑
jiangxiaoyun 发表于 2017-8-19 15:37
代码1:
SELECT a.门店, a.商品编码, a.销售额, sum(b.销售额) AS 累计销售额  FROM [销售表$] a inner  ...

  1. SELECT 门店, 商品编码, 销售额,sum(销售额) as 累计销售额 from [销售表$]
  2. where 商品编码= '" & 商品编码 & "'AND 门店<='" & 门店 & "'
  3. GROUP BY 商品编码,门店
复制代码

非常感谢您!这个问题差不多明白了。
但又有了新的疑惑。在于上面的代码为什么不对?
----------------------------------------------------------------------------------------------------------------
where 商品编码= '" & 商品编码 & "'AND 门店<='" & 门店 & "'
----------------------------------------------------------------------------------------------------------------
相当于自身和自身相比较的。这样的条件只有在域聚合函数中才能使用吗?


TA的精华主题

TA的得分主题

 楼主| 发表于 2017-8-19 17:43 | 显示全部楼层
  1. SELECT 门店, 商品编码, 销售额,sum(销售额) as 累计销售额 from [销售表$]
  2. where 商品编码= '" & 商品编码 & "'AND 门店<='" & 门店 & "'
  3. GROUP BY 商品编码,门店
复制代码


错误提示为“参数不足,期待是2”意思应该是2个字段名称在数据表中找不到。但是为什么用在域聚合函数时可以呢?

TA的精华主题

TA的得分主题

发表于 2017-8-20 00:58 | 显示全部楼层
感觉楼主对于域聚合函数第三参数也就是条件参数的用法和含义还没有完全理解,就这道题目来说,相当于在原表中增加了一个新的字段,这个字段的值由dsum域聚合函数计算得出,这里的域聚合函数有点像一个子查询,要求遍历全表,找出同时符合——1、商品编码=外层主查询(这词用的不规范但好理解)中的商品编码  2、门店名称<=外层主查询中的门店名称(要知道汉字也是有大小之分的,一般好像是根据音序来排序的) 这两个条件的条目,找到了符合这两个条件的所有条目后,将他们的销售额sum起来,作为累积销售额,你要注意的是,因为外层主查询中每一条的门店名是不同的,所以内层子查询所要比对的标准就不同,产生的条目数就不同,累计出来的销售额自然就不同, 最后根据商品编码和门店名称一排序,结果就一目了然了。 这个实例同时也可以使用子查询来实现,更容易理解,你可以参照我写的子查询对比一下域聚合函数的语句,就比较能够理解了。 QQ图片20170820005747.png

疑难97.rar

16.79 KB, 下载次数: 1

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2017-8-20 01:02 | 显示全部楼层
额我看帖不认真,上面的老师都把子查询代码写出了抱歉。

TA的精华主题

TA的得分主题

 楼主| 发表于 2017-8-20 05:46 来自手机 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
today0427 发表于 2017-8-20 00:58
感觉楼主对于域聚合函数第三参数也就是条件参数的用法和含义还没有完全理解,就这道题目来说,相当于在原表 ...

谢谢!有花再奉上

TA的精华主题

TA的得分主题

发表于 2017-8-20 08:35 | 显示全部楼层
autumnalRain 发表于 2017-8-19 17:22
非常感谢您!这个问题差不多明白了。
但又有了新的疑惑。在于上面的代码为什么不对?
-------------- ...

sum(a2:a10)为什么能求和,不也是遍历吗?

评分

1

查看全部评分

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

本版积分规则

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

GMT+8, 2024-3-29 22:10 , Processed in 0.067386 second(s), 14 queries , Gzip On, Redis On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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