2017-04-07 2 views
-3

私は以下のようなSQLiteテーブルデータを持っています。私はDataGridViewの中で提示したかった何Sqlite Get sum別の列に基づく列

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

これはSQLiteのデータベース内にあるこの

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

のようなものです。私はdatagridviewでデータを表示する必要があります。現在、私は最初のデータセットを取ってループし、目的の結果を得るためにコードを使用していますが、テーブルには多くの結果があり、処理が非常に遅いです。

皆さんはどうすれば2番目の結果を直接得ることができますか教えてください。私が検索していますが、私は

+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 /タイプごとに1行ずつ表示されますが、そうであればより良い結果が得られます。もう一つは安全ですが、それ自体で、テーブルに参加すると、その公演

+0

2番目のオプションでは、t.2から 'B'値を取るべきではありませんか? –

+1

あなたは正しいです、ありがとう!私はそれを修正した –

+0

素晴らしい。作品は完璧です。オプションありがとう。それは特別な場合に必要になるかもしれません。 –

0

これが何をすべきこの結果を得るために、任意の適切なSQLクエリを見つけることができませんでした:

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"); 
       } 
      } 
     } 
    } 
} 
関連する問題