以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.com/bbs/index.asp)
--  专家坐堂  (http://foxtable.com/bbs/list.asp?boardid=2)
----  相同数据合并  (http://foxtable.com/bbs/dispbbs.asp?boardid=2&id=154577)

--  作者:狐表(小白)
--  发布时间:2020/9/18 23:24:00
--  相同数据合并
老师。以下功能如何实现?

表A

列一      列二     列三
A          1,2          15
B           3            12
A           2,3,4       6
C           1,4          9
A           7,8          3
C           5            17

以列一的名称和列三的数值为条件,筛选出列一相同名字的所有行,按照列三最大的值和最小的值进行两行两行的相加合并,同时合并列二的字符串。完成后删除合并前的行。结果如下:
列一      列二         列三
A          1,2,7,8        18               等于第1行加第5行
A           2,3,4           6                没有行与其相加等于原来的行
B           3                12               没有行与其相加等于原来的行
C           1,4,5          26               等于第4行加第6行


--  作者:有点蓝
--  发布时间:2020/9/19 9:03:00
--  
A为什么是第1行加第5行?而不是第1行加第3行?
--  作者:linyunu1
--  发布时间:2020/9/19 12:14:00
--  
Dim s As New List(Of String)
Dim drs As List(Of DataRow) = DataTables("表A").Select("","第一列,第三列")
For Each dr As DataRow  In drs
    Dim dr1 As DataRow = DataTables("表A").Find("第一列 = \'" & dr("第一列") & "\'","第三列 desc",1)
    If dr1 IsNot Nothing And s.Contains(dr("第一列")) = False Then
        s.Add(dr("第一列"))
        dr("第二列") = dr("第二列") & "," & dr1("第二列")
        dr("第三列") = dr("第三列") + dr1("第三列")
        dr1.delete()
        dr.Save()
    End If
Next
[此贴子已经被作者于2020/9/19 12:18:16编辑过]

--  作者:狐表(小白)
--  发布时间:2020/9/19 12:25:00
--  
因为当第一列相同名字的有多行时,用第三列最大值加最小值得出的值总体来说分配的最合理!
--  作者:有点蓝
--  发布时间:2020/9/19 13:55:00
--  
Dim ss As List(Of String) = DataTables("表C").GetValues("第一列")
Dim dr,dr1 As DataRow
For Each s As String  In ss
    Dim drs As List(Of DataRow) = DataTables("表C").Select("第一列 = \'" & s & "\'","第三列")
    Do While drs.Count > 1
        dr = drs(0)
        dr1 = drs(drs.Count - 1)
        dr("第二列") = dr("第二列") & "," & dr1("第二列")
        dr("第三列") = dr("第三列") + dr1("第三列")
        drs.Remove(dr)
        drs.Remove(dr1)
        dr1.Delete
    Loop
Next

--  作者:狐表(小白)
--  发布时间:2020/9/19 14:24:00
--  
多谢蓝老师。结果很完美!图片点击可在新窗口打开查看
--  作者:狐表(小白)
--  发布时间:2020/9/20 17:44:00
--  
蓝老师,如果按照之前的功能要求,增加一个第四列同第一列一起做区分,如何实现以下目的?谢谢!
表A
列一      列二     列三       列四
A          1,2          15             赵
A           2,3,4        6             赵
A           7,8          3              李
A           7             3              张
B           3            12             赵
B            4            8              李
C           1,4          9              赵
C           5            17             赵

达到目的:
列一      列二         列三        列四
A          1,2,3,4       21             赵
A           7,8             3             李 
A           7               3              张
B           3               12            赵
B           4               8              李
C          1,4,5          26            赵


--  作者:有点蓝
--  发布时间:2020/9/20 21:07:00
--  
Dim ss As List(Of String()) = DataTables("表C").GetValues("第一列|")
Dim dr,dr1 As DataRow
For Each s As String()  In ss
    Dim drs As List(Of DataRow) = DataTables("表C").Select("第一列 = \'" & s(0) & "\' and  = \'" & s(1) & "\'","第三列")
    Do While drs.Count > 1
        dr = drs(0)
        dr1 = drs(drs.Count - 1)
        dr("第二列") = dr("第二列") & "," & dr1("第二列")
        dr("第三列") = dr("第三列") + dr1("第三列")
        drs.Remove(dr)
        drs.Remove(dr1)
        dr1.Delete
    Loop
Next

--  作者:狐表(小白)
--  发布时间:2020/9/20 21:57:00
--  
谢谢