1

このような注文表があります


ID OrderNumber アイテム 数量 小計 OrderedBy

1 2012-0001-12 バービー 1 10 トーマス
2 2012-0001-12 ケン 2 20 トーマス
3 2012-0001-23 ミッキー 4 28 トーマス
4 2012-0001-23 ミニー 3 21 トーマス
5 2012-0002-12 バービー 1 10 ピーター
6 2012-0003-01 ケーキ 1 12 トーマス
7 2012-0003-02 ワイン 1 70 トーマス

OrderNumber の最初の 2 つの部分、つまり最初の行2012-001が実際の注文 ID です。
追加された最後の部分は、この場合は関係のない SupplierID です。

したがって、このテーブルには 3 つの Order があります


OrderNumber OrderCount Total OrderedBy

2012-0001 4 79 トーマス
2012-0002 1 10 ピーター
2012-0003 2 82 トーマス

現在、データベースからすべてを取得し、変更SELECT時に別の汎用リストに追加した後、DataTable をループしています。その間、ループに itemCount と total も追加しています。2012-00012012-0002

これほど手間をかけずに、テーブル(sql)または列挙可能なコレクション(linq)として注文を取得する方法はありますか?

4

3 に答える 3

1

2番目のテーブルを作成するだけの場合は、次のことを試すことができます。

SELECT SUBSTRING(OrderNumber, 1, 9) AS OrderNumber
    , COUNT(*) AS OrderCount
    , SUM(Subtotal) AS Total
    , OrderedBy
FROM [Table]
GROUP BY SUBSTRING(OrderNumber, 1, 9), OrderedBy

これは、単一の注文が常に同じ人によって行われることを前提としています。

于 2012-04-24T05:52:53.987 に答える
1

部分文字列は機能しますか? http://msdn.microsoft.com/en-us/library/ms187748.aspx

SELECT SUBSTRING(OrderNumber, 1, 9) AS OrderNumber ...
于 2012-04-24T05:59:02.073 に答える
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()
                      };
于 2012-04-24T06:19:44.283 に答える