Sqlite根据另一列获取总和列

时间:2017-04-07 14:49:59

标签: c# sql vb.net sqlite datagridview

我有一个如下所示的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查询来获得此结果

3 个答案:

答案 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

答案 1 :(得分: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'

第一个选项要求每个ID / Type只有一行,但如果是这样,则表现更好。第二个更安全,但加入桌子会降低其性能

答案 2 :(得分: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");
                }
            }
        }
    } 
}