以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  多人合作的统计表问题  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=152099)

--  作者:670163008
--  发布时间:2020/7/8 23:03:00
--  多人合作的统计表问题

这些项目都是多人完成的,但是嘉奖只奖励给管理层。如果一个项目有两个以上管理层,嘉奖平均分配。其他人参与了项目的,不参加分配嘉奖。

我举的例子中,曹操、刘备、孙权三人是管理层。

比如,

曹操和孙权参加的项目,嘉奖各一半。

曹操和陆逊参加的项目,嘉奖全部给曹操。

孙权、刘备和陆逊参加的项目,嘉奖给孙权和刘备各一半。

如何形成一个统计表,统计出曹操、刘备、孙权所得的嘉奖。

 下载信息  [文件大小:   下载次数: ]
点击浏览该文件:统计.table


--  作者:有点蓝
--  发布时间:2020/7/9 9:07:00
--  
和这里的用法基本差不多的http://foxtable.com/bbs/dispbbs.asp?BoardID=2&ID=147418&skin=0

Dim dtb As New DataTableBuilder("统计")
dtb.AddDef("姓名", Gettype(String), 32)
dtb.AddDef("嘉奖", Gettype(Double))
dtb.Build()

Dim lst As new List(of String)
lst.AddRange({"曹操","刘备","孙权"})

Dim dict As new Dictionary(of String,Double)
Dim lst2 As new List(of String) \'记录其中是管理层的人
For Each r As Row In Tables("表A").Rows
    For Each s As String In r("姓名").split(",")
        If lst.Contains(s) Then lst2.Add(s)
    Next
    Dim fy As Double = r("嘉奖") / lst2.Count \'按管理层人数平分
    For Each s As String In lst2
        If dict.ContainsKey(s) Then
            dict(s) = dict(s) + fy
        Else
            dict.Add(s,fy)
        End If
    Next
Next
Dim dr,d2 As DataRow
For Each key As String In dict.Keys
    dr = DataTables("统计").AddNew
    dr("姓名") = key
    dr("嘉奖") = dict(key)
Next


--  作者:670163008
--  发布时间:2020/7/9 12:19:00
--  

算出来的结果不对啊

原表格

刘备,关羽,张飞 6000

曹操,曹仁      5000

孙权,刘备,陆逊 6000

曹操,刘备      6000

刘备,曹操,孙权 7000

曹操,陆逊      6000

 

算出的表格

刘备 20011.1111

曹操 10733.3333

孙权 5255.5555

 

实际应该是

刘备 14333.333

曹操 16333.333

孙权 5333.333


--  作者:y2287958
--  发布时间:2020/7/9 12:54:00
--  
Dim dic As new Dictionary(of String,Double)
Dim vs1() As String = "刘备,曹操,孙权".Split(",")
For Each dr As DataRow In DataTables("表A").DataRows
    Dim vs2() As String = dr("姓名").Split(",")
    For Each s As String In vs1.Intersect(vs2)
        Dim i As Double = dr("嘉奖")/vs1.Intersect(vs2).count
        If dic.ContainsKey(s) Then dic(s) += i Else dic.Add(s,i)
    Next
Next
For Each k As String In dic.Keys  \'显示所有键及其对应的值
    Output.Show(K & ":" & dic(k))
Next

--  作者:有点蓝
--  发布时间:2020/7/9 13:58:00
--  
……
Dim dict As new Dictionary(of String,Double)
Dim lst2 As new List(of String) \'记录其中是管理层的人
For Each r As Row In Tables("表A").Rows
    lst2.Clear
    For Each s As String In r("姓名").split(",")
        If lst.Contains(s) Then lst2.Add(s)
    Next
……