vb.net - 数据表和两行排序
问题描述
所以老板来找我说:“我想要一条线上的每个代理和项目的价值,以及下一条线上所有其他代理的平均值,这样我就可以很容易地看出它们是高于还是低于平均水平。”
该表如下所示:
dt.Columns.Add("AGENT", GetType(String))
dt.Columns.Add("PROJECT", GetType(String))
dt.Columns.Add("Sales", GetType(Integer))
dt.Columns.Add("Declines", GetType(Integer))
dt.Columns.Add("Margin", GetType(Integer))
好的,一切都很好。数据表中的一行是代理和项目。下一行是所有其他代理和项目的平均值,如下所示:
第 1 行:John Smith,ProjectName,(其他列值)
第 2 行:John Smith,ProjectName & "AVERAGE/TOTAL",(其他列值)
项目名称在 SSRS 报告中的 AVERAGE/TOTAL 行中被删除,因为打印它的纸张上的空间限制。
我按照我们对数据表进行排序的标准方式进行排序。
Dim dataView As New DataView(dt1)
dataView.Sort = "AGENT,PROJECT"
dt1 = dataView.ToTable
Return dt1
但是现在老板后来又有了新的要求。他希望能够按表中的其他列排序,但将两行(代理/项目和代理/项目 AVERAGE/TOTAL)保持在一起。所以本质上他希望能够不是按一行而是按两行排序,但排序值可以是“AGENT,Margin”。显然,要将两行保持在一起,我也必须找到一种对 Project 值进行排序的方法。
所以我很难过,并会感激你可能有的任何想法。C# 的想法也很受欢迎。LINQ 很好,但它必须成为一个数据表。
解决方案
所以你创建了两个表。一个是行值,一个是平均值。循环遍历行值,然后在该循环内执行另一个循环以匹配项目名称。它是一个黑客,但它有效。
If SortValue = "Default" Then
dt1.Merge(dt)
Dim dataView As New DataView(dt1)
dataView.Sort = "AGENT,PROJECT"
dt1 = dataView.ToTable
Else
Dim dataView As New DataView(dt)
dataView.Sort = SortValue
dt = dataView.ToTable
Dim dtCopy As New DataTable
dtCopy = dt.Clone
For Each row As DataRow In dt.Rows
dtCopy.ImportRow(row)
For i = 0 To dt1.Rows.Count - 1
If dt1.Rows(i).Item("PROJECT").ToString.Replace(" AVERAGE/TOTAL", "") = row.Item("PROJECT") And dt1.Rows(i).Item("AGENT") = row.Item("AGENT") Then
dtCopy.Rows.Add(dt1.Rows(i).Item("AGENT"), dt1.Rows(i).Item("PROJECT"), dt1.Rows(i).Item("SALES"), dt1.Rows(i).Item("Declines"), dt1.Rows(i).Item("Margin"))
End If
Next
Next
dt1 = dtCopy
End If
推荐阅读
- c# - 如何使用 Xamarin 表单保持屏幕顶部不移动
- python-3.x - Python setup.py 改变项目结构
- python-3.x - 重复创建 tensorflow 自定义模型实例并在循环内训练会出错
- python - 微服务架构的 Pyinstaller 支持多个服务到一个可执行文件
- javascript - 我的 Twilio 函数无法在 JSON REST API 中获取报价
- rx-swift - 有没有办法简化数据转换?
- .net-core - 在 C# 中按照 ISO 4217 标准格式化货币
- java - @CreatedDate 注解不适用于 spring-data-elasticsearch
- flutter - 使用 ConcatenatingAudioSource 时获取音频的下一个开始位置
- python - 自动化 Instagram 发布