ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 怎样通过发票数据找出“流失客户”?

[复制链接]

TA的精华主题

TA的得分主题

发表于 2022-12-19 14:37 | 显示全部楼层
Sub limonet()
    Dim Cn As Object, StrSQL$, Rs As Object, Arr As Variant, Brr As Variant, i%, S$
    Columns("A:e").ClearContents
    Set Cn = CreateObject("adodb.connection")
    Cn.Open "provider=microsoft.ace.oledb.12.0;extended properties=excel 12.0;data source=" & ThisWorkbook.FullName
    StrSQL = "select month(开票日期) as 月,购货方名称,购货方社会统一信用代码 from [发票数据$A:N] group by month(开票日期),购货方名称,购货方社会统一信用代码"
    StrSQL = "select 购货方社会统一信用代码 from (" & StrSQL & ") group by 购货方社会统一信用代码 having count(*)>=3"
    Arr = Cn.Execute(StrSQL).getrows
    For i = 0 To UBound(Arr, 2)
        StrSQL = "select top 2 year(开票日期)&'-'&month(开票日期) from [发票数据$A:N] where 购货方社会统一信用代码='" & Arr(0, i) & "' group by year(开票日期)&'-'&month(开票日期) order by year(开票日期)&'-'&month(开票日期) desc"
        Brr = Cn.Execute(StrSQL).getrows
        If DateDiff("M", Brr(0, 1), Date) > 12 Then S = S & "'" & Arr(0, i) & "',"
    Next i
    StrSQL = "select '流失客户' as 分类,购货方名称,购货方社会统一信用代码 from [发票数据$A:N] where 购货方社会统一信用代码 in(" & Left(S, Len(S) - 1) & ") group by 购货方名称,购货方社会统一信用代码"
    Set Rs = Cn.Execute(StrSQL)
    For i = 0 To Rs.Fields.Count - 1
        Sheet3.Cells(1, i + 1) = Rs.Fields(i).Name
    Next i
    Sheet3.Range("A2").CopyFromRecordset Rs
    Rs.Close
    Cn.Close
    Set Rs = Nothing
    Set Cn = Nothing
End Sub

TA的精华主题

TA的得分主题

 楼主| 发表于 2022-12-19 16:34 | 显示全部楼层
风中的我脸 发表于 2022-12-19 14:11
在有3个不同月份以上的客户中,一年内开票次数按月份分类至少有两个为非流失客户
不知道这样理解对吗
一 ...

是的

有个条件忽视了
以信用代码查重

谢谢

TA的精华主题

TA的得分主题

 楼主| 发表于 2022-12-19 17:12 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助

谢谢
也不知什么原因
我运行就会出错
WIN11 OFFICE2021

2.jpg
3.jpg

TA的精华主题

TA的得分主题

发表于 2022-12-19 17:13 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2022-12-23 17:22 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
风中的我脸 发表于 2022-12-19 14:11
在有3个不同月份以上的客户中,一年内开票次数按月份分类至少有两个为非流失客户
不知道这样理解对吗
一 ...

您好,请教一下,HAVING Count(*)>=3 and sum(iif(((" & lngYear & "-年)*12+" & lngMonth & "-月)>=12,0,1))<2"很精妙,反之,个人写的代码臭且长,有没有这方面的学习资料,谢谢。

TA的精华主题

TA的得分主题

发表于 2022-12-23 19:04 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
limonet 发表于 2022-12-23 17:22
您好,请教一下,HAVING Count(*)>=3 and sum(iif(((" & lngYear & "-年)*12+" & lngMonth & "-月)>=12,0 ...

请教算不上,我还是初学者

我是看了论坛里吴香版主的SQL教程

然后是这本SQL进阶教程(没看完,没耐心看了)
HAVING  sum(iif(((" & lngYear & "-年)*12+" & lngMonth & "-月)>=12这个技巧来自于书里讲到HAVING的那两章
group by划分子集,然后用iif可以对子集内的元素进行筛选(转化为特征1和0), 通过iif外层的聚合函数,就可以用having过滤这些子集了
书里用的是case...when
excel里没有,可以用iif 和 switch 来代替,差别是iif和swith不能嵌套子查询
书里写的主要是转变思路(用集合的思路代替程序的循环)







SQL进阶教程.part1.rar

2 MB, 下载次数: 7

SQL进阶教程.part2.rar

1.17 MB, 下载次数: 7

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2022-12-24 17:10 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
风中的我脸 发表于 2022-12-19 14:11
在有3个不同月份以上的客户中,一年内开票次数按月份分类至少有两个为非流失客户
不知道这样理解对吗
一 ...

请问,你这用的是啥编辑器?感觉很漂亮!能否分享一下?

TA的精华主题

TA的得分主题

发表于 2022-12-24 17:54 | 显示全部楼层
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-20 03:27 , Processed in 0.035914 second(s), 7 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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