我有一个像这样的订单表
ID OrderNumber Item Quantity Subtotal OrderedBy 1 2012-0001-12 Barbie 1 10 Thomas 2 2012-0001-12 Ken 2 20 Thomas 3 2012-0001-23 Mickie 4 28 Thomas 4 2012-0001-23 Minnie 3 21 Thomas 5 2012-0002-12 Barbie 1 10 Peter 6 2012-0003-01 Cake 1 12 Thomas 7 2012-0003-02 Wine 1 70 Thomas
在OrderNumber中,前两个部分(即第一行 2012-001 )是实际的订单ID。
附加的最后一部分是SupplierID,在这种情况下不相关。
所以这个表现在有三个订单
OrderNumber OrderCount Total OrderedBy 2012-0001 4 79 Thomas 2012-0002 1 10 Peter 2012-0003 2 82 Thomas
目前我在SELECT
数据库之后循环遍历DataTable,并在2012-0001
更改为2012-0002
时将其添加到另一个通用列表中。同时我也在循环中添加itemCount和total。
有没有办法在没有这么麻烦的情况下获取表(sql)中的订单或者作为可枚举的集合(linq)?
答案 0 :(得分:1)
如果您只是想创建第二个表,那么您可以尝试以下方法:
SELECT SUBSTRING(OrderNumber, 1, 9) AS OrderNumber
, COUNT(*) AS OrderCount
, SUM(Subtotal) AS Total
, OrderedBy
FROM [Table]
GROUP BY SUBSTRING(OrderNumber, 1, 9), OrderedBy
这假设单个订单总是由同一个人完成。
答案 1 :(得分:1)
子串会起作用吗? http://msdn.microsoft.com/en-us/library/ms187748.aspx
SELECT SUBSTRING(OrderNumber, 1, 9) AS OrderNumber ...
答案 2 :(得分:1)
var summary = from drow in dataTable.AsEnumerable()
let grp = drow["OrderNumber"].ToString().Substring(0, drow["OrderNumber"].ToString().LastIndexOf("-"))
group drow by grp into g
select new {OrderNumber = g.Key,
OrderCount = g.Sum(x => Convert.ToInt32(x["Quantity"])),
Total = g.Sum(y => Convert.ToInt32(y["Subtotal"])),
OrderedBy = g.Select( n => n["OrderedBy"].ToString()).First()
};