代码之家  ›  专栏  ›  技术社区  ›  Lady A

获取DataTable VB中所需值的总和。网

  •  1
  • Lady A  · 技术社区  · 6 年前

    我有一个包含以下字段的datatable:

    • 白天
    • 日期
    • 房价
    • 人员数量
    • 数量

    数据如下:

    Day Date    Room No.    Room Rate   No. of Person       Amount
    1   4/9/2018    101         900.00      2           1, 800.00
    2   4/10/2018   101         900.00      2           1, 800.00
    3   4/10/2018   101         900.00      2           1, 800.00
    1   4/9/2018    102         1000.00     3           3, 000.00
    2   4/10/2018   102         1000.00     3           3, 000.00
    3   4/10/2018   102         1000.00     3           3, 000.00
    

    我想通过得到总金额来得到总金额。但是,不应包括每个房间的最后一天。在上述示例中,总金额为9600.00,因为第3天的101室和102室不包括在内。

    我尝试使用datatable compute函数,但这将无效:

    Convert.ToInt32(DataSet.Tables("dt_Lodging").Compute("SUM(Amount)", "Day = 3") 
    

    一天不限于3天。如果我们有第1天到第5天,第5天将不包括在总数中。

    1 回复  |  直到 6 年前
        1
  •  1
  •   PavlinII    6 年前

    试试他的台词

    Dim Amount As Decimal = T.Rows.OfType(Of DataRow).GroupBy(Function(X) CStr(X("RoomNo"))).Sum(Function(Room) Room.Take(Room.Count - 1).Sum(Function(X) pDec(X("Amount"))))
    

    但关于RoomNo列的名称,您的问题并不清楚。根据你的问题,这个问题有一些假设。 当房间号在不同的时段重复时,它将不起作用。或者当行未按日期排序时。

    此解决方案未以任何方式进行优化。它只是计算值。

    房价是否因日期而异?房价*住宿天数是更好的解决方案。无论如何,你应该在晚上而不是白天工作。

    编辑: 完整代码版本

    Public Sub Test()
        Dim R As DataRow, i As Integer
        Using T As New DataTable
            T.Columns.Add("RoomNo", GetType(String))
            T.Columns.Add("Amount", GetType(Decimal))
            For i = 1 To 3
                R = T.NewRow
                R("RoomNo") = "101"
                R("Amount") = 1800
                T.Rows.Add(R)
                R = T.NewRow
                R("RoomNo") = "102"
                R("Amount") = 3000
                T.Rows.Add(R)
            Next
            Dim Amount As Decimal = T.Rows.OfType(Of DataRow).GroupBy(Function(X) CStr(X("RoomNo"))).Sum(Function(Room) Room.Take(Room.Count - 1).Sum(Function(X) CDec(X("Amount"))))
            Debugger.Break()
        End Using
    End Sub