質問の内容がこれであっているのかどうか疑わしいのですが。
以下のようなCSVデータを使うものとします。
1459,食費,8月6日,さば、豚切り落とし他
970,食費,8月9日,とまと、枝豆
86,娯楽,8月14日,マンガレンタル
324,雑貨,8月14日,ボタン電池、漬物 100円ショップ
172,娯楽,8月14日,中古マンガ
216,食費,8月14日,炭酸水
705,食費,8月14日,
669,食費,8月8日,
172,娯楽,8月8日,マンガレンタル
206,食費,8月8日,
268,食費,8月8日,コンビニ
コードはoledbを使い、以下のようになります。
ソースコードを実行可能なものに書き直します。失礼しました。
それと、プロジェクトファイルを添付しておきます。
C#
1 using System; 2using System.Data.OleDb; 3using System.Data; 4using System.IO; 5using System.Windows.Forms; 6 7 8namespace WindowsFormsApp4 9{ 10 public partial class Form1 : Form 11 { 12 public Form1() 13 { 14 InitializeComponent(); 15 } 16 17 private void Form1_Load(object sender, EventArgs e) 18 { 19 20 CSV_to_chart("2018年8月.csv"); 21 } 22 23 private void CSV_to_chart(string ReadFile) 24 { 25 26 27 28 chart1.Series.Clear(); 29 chart1.Series.Add("合計"); 30 31 32 33 34 35 36 37 try 38 { 39 string current = Directory.GetCurrentDirectory(); 40 41 // Full path to the data source file 42 43 string file = ReadFile; 44 string path = current + "\Data\"; 45 //実行ファイル直下に「Data」ファルダを作る 46 47 // Create a connection string. 48 string ConStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + 49 path + ";Extended Properties=\"Text;HDR=No;FMT=Delimited\""; 50 OleDbConnection myConnection = new OleDbConnection(ConStr); 51 52 53 54 string mySelectQuery = ""; 55 56 57 58 mySelectQuery = "SELECT F3, F2, Sum(F1) FROM " + "\" + "[" + file + "]" + " Group by f3, f2 Order by Format(F3,'MMDD'), F2"; 59 //+、-スペース入りファイル名も使えるようにする 60 61 62 63 chart1.Series[0].Label = "#VAL{C}"; 64 //Chartに価格ラベルを表示する 65 66 67 68 OleDbCommand myCommand = new OleDbCommand(mySelectQuery, myConnection); 69 // Open the connection and create the reader 70 myCommand.Connection.Open(); 71 OleDbDataReader myReader = myCommand.ExecuteReader(CommandBehavior.CloseConnection); 72 73 74 chart1.ChartAreas[0].InnerPlotPosition.Width = 90; 75 chart1.ChartAreas[0].InnerPlotPosition.Height = 90; 76 chart1.ChartAreas[0].InnerPlotPosition.X = 8; 77 chart1.ChartAreas[0].InnerPlotPosition.Y = 0; 78 79 80 chart1.ChartAreas[0].IsSameFontSizeForAllAxes = true; 81 82 83 chart1.Series[0].Points.DataBindXY(myReader, "0", myReader, "1"); 84 85 myReader.Close(); 86 myConnection.Close(); 87 88 89 } 90 catch (OleDbException OleEx) 91 { //Console.WriteLine(OleEx.ToString()); 92 93 MessageBox.Show(OleEx.Message); 94 } 95 } 96 } 97} 98
表示は以下のようになります。
以上をこのように日付でグループ化しています。
また、クエリを変えることで、項目毎に集計も出来ました。
mySelectQuery = "SELECT F2,Sum(F1) FROM " + "\" + "[" + file + "]" + " Group by F2";
今のところここまでが限界で、
日時
┗項目
のように集計出来るのが理想なんです。
サブクエリというのがあると知り、打ち込んでみましたが、例外を吐くばかりで上手くいきません。
適切なクエリの書き方を教えていただけると助かります。
回答いただいたコードの結果
mySelectQuery = "SELECT F3, F2, Sum(F1) FROM " + "" +"[" + file+"]" + " Group by f3, f2 Order by Format(F3,'MMDD'), F2";
ちなみに 自分が試したのは
```ここに言語を入力
mySelectQuery = "SELECT F3, F2, Sum(F1) FROM " + "" +"[" + file+"]" + " Group by f3, f2 Order by Format(F3,'MMDD')"でした。
他のもの //mySelectQuery = "SELECT *,Sum(F1) FROM " + "\" + file + " WHERE F2 = (SELECT F2 FROM " + "\" + file + ")"; 意味がよくわかってないと思います。 0. さらに試したこと Quitaの記事からの流用になります。 [【C#】CSV、Excelファイルの内容をDataTableに格納する](https://qiita.com/OneK/items/c3077aea595635f40ee5) ``` public static DataTable GetDataTableFromCSV(String strFilePath, Boolean isInHeader = true) { dt = new DataTable(); String strInHeader = isInHeader ? "YES" : "NO"; // ヘッダー設定 String strCon = "Provider=Microsoft.ACE.OLEDB.12.0;" // プロバイダ設定 //= "Provider=Microsoft.Jet.OLEDB.4.0;" // Jetでやる場合 + "Data Source=" + Path.GetDirectoryName(strFilePath) + "\; " // ソースファイル指定 + "Extended Properties=\"Text;HDR=" + strInHeader + ";FMT=Delimited\""; OleDbConnection con = new OleDbConnection(strCon); String strCmd = "SELECT * FROM [" + Path.GetFileName(strFilePath) + "]"; // 読み込み OleDbCommand cmd = new OleDbCommand(strCmd, con); OleDbDataAdapter adp = new OleDbDataAdapter(cmd); adp.Fill(dt); // ds.Tables.Add(dt); return dt; }
さらに
```
private void CSV_to_chart(string ReadFile)
{
dt = GetDataTableFromCSV(current + "\2018年8月.csv", false); string[] seriesArray = dt.AsEnumerable().Select(r => r.Field<string>("F2")).Distinct().ToArray(); //"F2"を名前解決する処理 foreach (string s in seriesArray) { chart1.Series.Add(s); } mySelectQuery = "SELECT F3, F2, Sum(F1) FROM " + "\" + "[" + file + "]" + " Group by f3, f2 Order by Format(F3,'MMDD'), F2"; //グラフが表示されない
// 以下略
このようにすることで以下の結果を得ました。  系列が追加されていないので表示されないのかと思ったんですが、クエリ側との不一致があるのかやはり表示されませんでした。 参考までに自作の記事を添えておきます。 [C# DataTable to Chart Display(家計簿用サンプル) ](https://mojakouinfotaker.blog.fc2.com/blog-entry-1042.html)





回答4件
あなたの回答
tips
プレビュー