본문 바로가기
프로그래밍/C#

DataTable에서 Group By Sum 하기

by zoo10 2015. 1. 19.

DataTable 에서 Group by 할일이 생겼는데, LINQ를 사용할 수 없는 상태였다.

참으로 좋은 시스템을 가지셔서 아직 .NET 2 버젼이기 때문이다. 헐~

아래 함수를 만드신 아주 귀하신 분때문에 문제를 해결할 수 있었다.



private DataTable GetGroupedBy(DataTable dt, string columnNamesInDt, string groupByColumnNames, string typeOfCalculation)
{
    //Return its own if the column names are empty
    if (columnNamesInDt == string.Empty || groupByColumnNames == string.Empty)
    {
        return dt;
    }

    //Once the columns are added find the distinct rows and group it bu the numbet
    DataTable _dt = dt.DefaultView.ToTable(true, groupByColumnNames);

    //The column names in data table
    string[] _columnNamesInDt = columnNamesInDt.Split(',');

    for (int i = 0; i < _columnNamesInDt.Length; i = i + 1)
    {
        if (_columnNamesInDt[i] != groupByColumnNames)
        {
            _dt.Columns.Add(_columnNamesInDt[i]);
        }
    }

    //Gets the collection and send it back
    for (int i = 0; i < _dt.Rows.Count; i = i + 1)
    {
        for (int j = 0; j < _columnNamesInDt.Length; j = j + 1)
        {
            if (_columnNamesInDt[j] != groupByColumnNames)
            {
                _dt.Rows[i][j] = dt.Compute(typeOfCalculation + "(" + _columnNamesInDt[j] + ")", groupByColumnNames + " = '" + _dt.Rows[i][groupByColumnNames].ToString() + "'");
            }
        }
    }
    return _dt;

}

아래는 호출부 

DataTable dtGroupedBy = GetGroupedBy(dt, "CodeName,Quantity,Current", "CodeName", "Sum");


주의 : 두번째 인자에 공백을 두지 않도록 하자. 컬럼명에 공백이 생긴다.


실제로 테스트 해보고 실전에 사용했더니 잘 된다. 무려 감사드린다. 아래는 원글 주소이다.


// 문제점

모든 데이터가 숫자형이어야 함.(이것때매 많이 수정해야 할 듯)....


https://reachtokiranblog.wordpress.com/2013/08/27/apply-group-by-clause-on-datatable-in-c/