2017-04-07 46 views
-3

我有一個像下面給出的SQLite表數據。Sqlite獲取總結基於另一列的列

ID Type Amount 
----------------------- 
1  A  10 
1  B  5 
2  A  4 
2  B  7 
3  A  2 
3  B  8 

我想呈現一個DataGridView什麼是這樣的

ID A B 
------------- 
1 10 5 
2 4 7  
3 2 8 

這是SQLite數據庫。我需要在datagridview中顯示數據。目前,我正在使用第一個數據集並使用代碼循環以獲得所需結果,但該表有很多結果,因此該過程非常緩慢。

你們可以請告訴我怎樣才能直接得到第二個結果。我有搜索,但我找不到任何適當的SQL查詢來獲取這個結果

+0

爲什麼downvote?這是可悲的。初學者來這裏尋求幫助沒有別的。堆棧溢出教會了我很多東西。 –

回答

0

你可以做到這一點與條件聚集

select ID, 
     sum(case when Type = 'A' then Amount) as A 
     sum(case when Type = 'B' then Amount) as B 
from yourTable 
group by ID 

另一種選擇是加入與自己的表

select ID, t1.Amount as A, t2.Amount as B 
from yourTable t1 
join yourTable t2 
on  t1.ID = t2.ID 
where t1.Type = 'A' and 
     t2.Type = 'B' 

第一個選項要求你有onl每個ID /類型一行,但如果情況更好。第二個是安全的,但本身加入表會降低其性能

+0

在第二種選擇中,不應該從t.2中取出'B'值嗎? –

+1

你是對的,謝謝!我修好了 –

+0

太棒了。完美運作。感謝您的選擇。在特殊情況下可能需要它。 –

0

這應該這樣做:

SELECT ID, 
    SUM(CASE WHEN Type = 'A' THEN Amount ELSE 0 END) as A, 
    SUM(CASE WHEN Type = 'B' THEN Amount ELSE 0 END) as B 
FROM TABLE 
GROUP BY ID 
0

你想要一個透視表:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Data; 

namespace ConsoleApplication49 
{ 
    class Program 
    { 

     static void Main(string[] args) 
     { 
      DataTable dt = new DataTable(); 
      dt.Columns.Add("ID", typeof(int)); 
      dt.Columns.Add("Type", typeof(string)); 
      dt.Columns.Add("Amount", typeof(int)); 

      dt.Rows.Add(new object[] {1, "A", 10}); 
      dt.Rows.Add(new object[] {1, "B", 5}); 
      dt.Rows.Add(new object[] {2, "A", 14}); 
      dt.Rows.Add(new object[] {2, "B", 7}); 
      dt.Rows.Add(new object[] {3, "A", 2}); 
      dt.Rows.Add(new object[] {3, "B", 8}); 

      string[] uniqueTypes = dt.AsEnumerable().Select(x => x.Field<string>("Type")).Distinct().ToArray(); 

      DataTable pivot = new DataTable(); 
      pivot.Columns.Add("ID", typeof(int)); 

      foreach (string _type in uniqueTypes) 
      { 
       pivot.Columns.Add(_type, typeof(int)); 
      } 

      var groups = dt.AsEnumerable().GroupBy(x => x.Field<int>("ID")).ToList(); 

      foreach (var group in groups) 
      { 
       DataRow newRow = pivot.Rows.Add(); 

       newRow["ID"] = group.Key; 

       foreach (DataRow row in group) 
       { 
        newRow[row.Field<string>("Type")] = row.Field<int>("Amount"); 
       } 
      } 
     } 
    } 
}