我有一个如下所示的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 :(得分: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");
}
}
}
}
}