2015-05-08 78 views
0

我有DataTable可以有半重複的行。在圖片示例中,兩個突出顯示的行具有所有相同的值,但「金額」列中的金額相同。我需要確定這些行並將金額$相加。數據來自文本文件,沒有唯一標識行的鍵。DataTable sum duplicate rows

enter image description here

我看着這樣一個 Best way to remove duplicate entries from a data table但對我來說一些答案需要匹配不只是一個列,但10

我也嘗試過不同的LINQ查詢,但沒有成功走得很遠。

這是SQL查詢該做的工作:

SELECT [Date1],[Date2],[Date3] 
     ,SUM([Amount1]) as Summary1 
     ,SUM([Amount2]) as Summary2 
     ,SUM([Amount3]) as Summary3 
     ,[col1],[col2],[Rate1],[Rate2],[Rate3],[product],[comment] 
    FROM [Table] 
    group by [Date1],[Date2],[Date3],[col1],[col2],[Rate1],[Rate2],[Rate3],[product],[comment] 

編輯:只是爲了澄清,SQL查詢是我怎麼能獲得成功的結果,如果我是查詢SQL表的例子。

+0

你需要做'GroupBy'一些功能,如日期1,列1等 –

+0

所以這裏有什麼問題或問題@AidaM查詢產生正確的結果..?如果你正在從文本文件加載/讀取數據..這實際上很容易做..你是否熟悉稱爲'控制斷裂處理'谷歌如何使用'GroupBy'如果你從Sql查詢運行 – MethodMan

+0

我剛剛在SQL中測試過這個查詢,但是我的應用程序數據也沒有出現,也沒有進入SQL。我通過將輸入數據保存到數據表來處理輸入數據,並在處理後將其導出爲Excel文件。我需要做什麼SQL查詢示例將使用LINQ或其他方式。 @MethodMan – AidaM

回答

0

這是你將如何與EF做到這一點:

var result=db.Table 
    .GroupBy(r=>new { 
     r.Date1, 
     r.Date2, 
     r.Date3, 
     r.col1, 
     r.col2, 
     r.Rate1, 
     r.Rate2, 
     r.Rate3, 
     r.product, 
     r.comment}, 
    p=>new { 
     p.Amount1, 
     p.Amount2, 
     p.Amount3}, 
    (key,vals)=>new { 
     key.Date1, 
     key.Date2, 
     key.Date3, 
     Amount1=vals.Sum(v=>v.Amount1), 
     Amount2=vals.Sum(v=>v.Amount2), 
     Amount3=vals.Sum(v=>v.Amount3), 
     key.col1, 
     key.col2, 
     key.Rate1, 
     key.Rate2, 
     key.Rate3, 
     key.product, 
     key.comments} 
    ); 

輕微的修改,如果你實際上是做它從一個DataTable:

var result=dt.AsEnumerable() 
    .GroupBy(d=>new { 
     Date1=d.Field<datetime>("Date1"), 
     Date2=d.Field<datetime>("Date2"), 
     Date3=d.Field<datetime>("Date3"), 
     col1=d.Field<string>("col1"), 
     col2=d.Field<string>("col2"), 
     Rate1=d.Field<decimal>("Rate1"), 
     Rate2=d.Field<decimal>("Rate2"), 
     Rate3=d.Field<decimal>("Rate3"), 
     product=d.Field<string>("product"), 
     comments=d.Field<string>("comments")}, 
    p=>new { 
     Amount1=p.Field<decimal>("Amount1"), 
     Amount2=p.Field<decimal>("Amount2"), 
     Amount3=p.Field<decimal>("Amount3")}, 
    (key,vals)=>new { 
     key.Date1, 
     key.Date2, 
     key.Date3, 
     Amount1=vals.Sum(v=>v.Amount1), 
     Amount2=vals.Sum(v=>v.Amount2), 
     Amount3=vals.Sum(v=>v.Amount3), 
     key.col1, 
     key.col2, 
     key.Rate1, 
     key.Rate2, 
     key.Rate3, 
     key.product, 
     key.comments} 
    ); 

如果你需要的結果作爲一個DataTable,你可以使用其中的許多List To Datatable擴展方法。只需在上述查詢結尾處添加「.ToList()。AsDataTable()」,即可將其恢復到數據表中。

+1

在這個線程中有一些示例擴展方法:http://stackoverflow.com/questions/9937573/convert-select-new-to-datatable –

+0

謝謝你的幫助,這很好用!我考慮將其轉換回DataTable,但不必;而是我循環每個結果行並生成我的最終輸出Excel文件。 @羅伯特 - 麥基 – AidaM