使用特殊类型的分组/聚合从数据库中获取订单

时间:2012-04-24 05:43:34

标签: c# sql linq ms-access

我有一个像这样的订单表


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)?

3 个答案:

答案 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()
                      };