2017-04-07 43 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"); 
       } 
      } 
     } 
    } 
}