[C#/.Net] SQL Group by Sum 효과 메소드
현 블로그는 모바일 환경이 아닌 PC환경에 최적화 되어있습니다.
|
|
Group by Sum 효과 메소드
C#으로 DataTable의 내용을 Group by Sum 해보자.
LINQ를 공부하는 중이였는데..
이번 프로젝트에서 LINQ를 쓰지말라고 하네요. (다른 사람이 헷갈린다고..)
뭐 음... 네 그래서 LINQ를 쓰지않고 가져온 데이터를 Group by Sum하는 함수를 만들었습니다.
(사실은 공부중이여서 LINQ로는 어찌하는지 모릅니다. 사용해 보고 싶었는데.. ㅠ)
해당 함수는 아래와 같이 작동합니다.
- 기본 데이터 -
- 부서별 월급 합계 -
- 그룹별(전체) 월급,보너스 합계 -
- 팀별 보너스 합계 -
- 부서,팀 별 월급,보너스 합계 -
아래 GetGroupBySum()메소드에 DataTable과 집계(Sum)을 할 컬럼들, 그룹(Group) 컬럼을 parameter로 넣어주면 됩니다.
마지막 parameter로 Boolean값을 받는데
이건 Parameter로 넣은 DataTable과 컬럼구조를 똑같이 가져올것이냐
아니면 위 Parameter로 넣은 컬럼만 가져올것이냐 묻는것입니다.
(이건 넣은 이유가 따로 있습니다. 궁금하시면 연관글에서 부서,팀별 합계 데이터 삽입하기를 보시면 됩니다.)
많은 도움되었으면 좋겠습니다.
- 소스 -
using System; using System.Data; using System.Windows.Forms; namespace GroupbySum { public partial class GroupBySumTest : Form { public GroupBySumTest() { InitializeComponent(); //기본 데이터 //dataGridView1.DataSource = Create_Sample(); //부서별 월급 합계 //dataGridView1.DataSource = GetGroupBySum(Create_Sample(), new string[] { "Salary" }, new string[] { "Dept" }, false); //그룹별(전체) 월급,보너스 합계 //dataGridView1.DataSource = GetGroupBySum(Create_Sample(), new string[] { "Salary", "Bonus" }, new string[] { "Group" }, false); //팀별 보너스 합계 //dataGridView1.DataSource = GetGroupBySum(Create_Sample(), new string[] { "Bonus" }, new string[] { "Team" }, false); //부서,팀 별 월급,보너스 합계 //dataGridView1.DataSource = GetGroupBySum(Create_Sample(), new string[] { "Salary", "Bonus" }, new string[] { "Dept", "Team" }, false); } DataTable Create_Sample() { //DataTable 생성 DataTable dt = new DataTable { TableName = "TestTbl" }; //Columns 생성 dt.Columns.AddRange(new DataColumn[] { new DataColumn { ColumnName = "Group", Caption = "그룹", DataType = typeof(string) } , new DataColumn { ColumnName = "Dept", Caption = "부서", DataType = typeof(string) } , new DataColumn { ColumnName = "Team", Caption = "팀", DataType = typeof(string) } , new DataColumn { ColumnName = "User", Caption = "사원", DataType = typeof(string) } , new DataColumn { ColumnName = "Salary", Caption = "월급", DataType = typeof(int) } , new DataColumn { ColumnName = "Bonus", Caption = "보너스", DataType = typeof(string) } }); DataRow dr = dt.NewRow(); dt.Rows.Add(new object[] { "기획그룹", "기획부", "기획팀", "기획1" ,100 ,"10" }); dt.Rows.Add(new object[] { "기획그룹", "기획부", "기획팀", "기획2", 200, "20" }); dt.Rows.Add(new object[] { "기획그룹", "기획부", "보조", "기획보조1", 10, "20" }); dt.Rows.Add(new object[] { "기획그룹", "기획부", "보조", "기획보조2", 20, "20" }); dt.Rows.Add(new object[] { "기획그룹", "기획부", "보조", "기획보조3", 30, "20" }); dt.Rows.Add(new object[] { "기획그룹", "생산부", "생산팀", "생산1", 110, "10" }); dt.Rows.Add(new object[] { "기획그룹", "생산부", "생산팀", "생산2", 220, "20" }); dt.Rows.Add(new object[] { "기획그룹", "생산부", "생산팀", "생산3", 330, "30" }); dt.Rows.Add(new object[] { "기획그룹", "생산부", "보조", "생산보조1", 11, "10" }); dt.Rows.Add(new object[] { "기획그룹", "생산부", "보조", "생산보조2", 22, "20" }); dt.Rows.Add(new object[] { "기획그룹", "생산부", "보조", "생산보조3", 33, "30" }); return dt; } ////// DataTable의 Data로 SQL Group by Sum 효과 메소드 /// /// Data /// Sum Columns /// Group Columns /// 리턴시 기존 DataTable의 컬럼을 모두 받을것인지 ///false시 Sum Column과 Group Column만 리턴 < /// /param> ///private DataTable GetGroupBySum(DataTable dt, string[] sumColumnNames, string[] groupByColumnNames, bool reAllColumn) { DataTable dt_Return = null; try { //Check datatable if (dt == null || dt.Rows.Count < 1) { return dt; } //Check sum columns if (sumColumnNames == null || sumColumnNames.Length < 1) { return dt; } //Check group columns if (groupByColumnNames == null || groupByColumnNames.Length < 1) { return dt; } //Create return datatable dt_Return = dt.DefaultView.ToTable(true, groupByColumnNames); //Set return Columns if (reAllColumn) { for (int i = 0; i < dt.Columns.Count; i++) { if (!dt_Return.Columns.Contains(dt.Columns[i].ColumnName)) { DataColumn dc = new DataColumn(dt.Columns[i].ColumnName, dt.Columns[i].DataType); dt_Return.Columns.Add(dc); } } } else { for (int i = 0; i < sumColumnNames.Length; i++) { if (dt.Columns.Contains(sumColumnNames[i])) { DataColumn dc = new DataColumn(sumColumnNames[i], dt.Columns[sumColumnNames[i]].DataType); dt_Return.Columns.Add(dc); } } } //Summary Rows for (int i = 0; i < dt_Return.Rows.Count; i++) { var sQuery = " 1=1 "; foreach (var col in groupByColumnNames) { sQuery += "AND " + col + " = '" + dt_Return.Rows[i][col].ToString() + "'"; } DataRow[] drs = dt.Select("(" + sQuery + ")"); foreach (var dr in drs) { foreach (var col in sumColumnNames) { int sum, val = 0; int.TryParse(dt_Return.Rows[i][col].ToString(), out sum); int.TryParse(dr[col].ToString(), out val); dt_Return.Rows[i][col] = sum + val; } } } } catch (Exception ex) { } return dt_Return; } } }
혹시 Exception이 일어나거나 또는 좀 더 좋은 소스가 있으면 공유 부탁드려요~ ㅠ
※ 관련글
'C# > DataTable' 카테고리의 다른 글
[C#/.Net] DataGridView 화면에 Date Table Colums, row 생성하기 (1) (0) | 2021.01.12 |
---|---|
[C#/.Net] 부서,팀별 합계 데이터 삽입하기 (0) | 2016.01.09 |
[C#/.Net] Object Array를 사용하여 DataTable Row 한번에 추가하기 (0) | 2015.11.12 |
[C#/.Net] DataTable 중복 Row 제거하기 (distinct 효과) (0) | 2015.11.12 |
[C#/.Net] DataTable 복수 Column 한번에 추가하기 (0) | 2015.11.09 |