以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  请教一个比对问题  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=133175)

--  作者:douglas738888
--  发布时间:2019/4/9 8:49:00
--  请教一个比对问题

请教老师,想设计一个SQL比对统计,请给予指导,谢谢!

 

比如:一个Table中有一个列为客户名称,根据入档日期进行统计当年的新增客户数,如果新增的客户名称与原来的客户名称进行比对,如果重复不进行统计,如果不重复进行统计

 

客户名称       入档日期

AAA            2018-01-01

BBB            2018-02-02

CCC            2018-03-03

AAA            2018-04-04

AAA            2019-02-02

BBB            2019-02-02

DDD           2019-03-03

 

想实现统计结果,2018年新增客户数为3(这里采用不重复统计可以实现), 2019年新增客户数为1(这里的客户DDD如何与所有行进行客户名称的字符比对进行统计?)


--  作者:有点甜
--  发布时间:2019/4/9 9:18:00
--  

直接用这个,如

 

http://www.foxtable.com/webhelp/scr/2747.htm

 


--  作者:douglas738888
--  发布时间:2019/4/9 10:03:00
--  

老师,GetValues或SQLGetValues,只是获取或统计不重复值,但是怎样比对统计某年度新出现的客户名称数量

 

比如:下面代码只能统计出不重复客户的数量,根据上面例子,得到的值是4,怎样设置条件,2019年统计出的值是1(因为2019的客户中AAA和BBB已经是老客户,在2018年已有,2019年不计入统计,2019年新客户只有DDD)

Dim Total As Integer

Dim acs As List(Of String) = Tables("客户档案").DataTable.SQLGetValues("客户名称","入档完成 = 1") \'不重复合计

Total = acs.Count


--  作者:y2287958
--  发布时间:2019/4/9 10:26:00
--  
Dim lst As new List(of String)
Dim dic As New Dictionary(Of String, String)
For Each dr As DataRow In DataTables("CC").DataRows
    If dr.IsNull("客户名称") = False AndAlso dr.IsNull("入档日期") = False
        If lst.Contains(dr("客户名称")) = False
            lst.Add(dr("客户名称") )
            Dim d As Date = dr("入档日期")
            Dim key As String = d.Year
            If dic.ContainsKey(key)
                dic(key) += "/" & dr("客户名称")
            Else
                dic.Add(key,dr("客户名称"))
            End If
        End If
    End If
Next
For Each k As String In dic.Keys
    Output.Show(K & ":" & dic(k))
Next

--  作者:douglas738888
--  发布时间:2019/4/9 11:01:00
--  
楼上的老师厉害,非等比较+字典,学习了。  另外,如何count出比如2019年的新客户数?
--  作者:y2287958
--  发布时间:2019/4/9 11:04:00
--  
全在字典里
--  作者:有点甜
--  发布时间:2019/4/9 11:37:00
--  

 

统计18年的用户个数,统计18、19年的用户个数,相减,就是值啊。

 

 

 

 


--  作者:douglas738888
--  发布时间:2019/4/9 11:48:00
--  

甜老师,不是单纯的相减,上面另一个老师指导的代码是通过字典形式得到结果是一种方式

 

甜老师所说的相减统计是包含了其他年的同名客户的统计数量,如果19年的客户中有18年同名的不进行统计,只统计不同名的,这里不用相减,我一直没理清楚如何进行这样的后台统计


--  作者:有点甜
--  发布时间:2019/4/9 13:03:00
--  

如果你没有删除用户、减少用户的操作,就是简单的相减就行。

 

统计18年数据3,统计18年、19年数据4,相减等于1,即可。


--  作者:douglas738888
--  发布时间:2019/4/9 14:47:00
--  

老师,经测试,可以这样来单项统计,但不知效率影响如何

 

Dim y1 As Integer = 2019 \'指定年份
Dim dt3 As New Date(y1, 1, 1)
Dim dt4 As New Date(y1, 12, 31)


Dim str As String = DataTables("客户档案").SQLGetComboListString("客户名称","入档时间 < \'" & dt3 & "\'")
str = str.Replace("|", "\',\'")

Dim it As Integer
Dim kcbs As List(of String)
kcbs = DataTables("客户档案").SQLGetvalues("客户名称", "客户名称 Not In (\'" & str & "\') and 入档时间 >= \'" & dt3 & "\' And 入档时间 <= \'" & dt4 & "\'")
For Each s As String In kcbs
output.show(s)
Next
it = kcbs.count
messagebox.show(it)