Linq 메소드를 이용한 피봇 테이블 만들기

Linq 함수를 이용하여 Pivot 테이블을 생성하는 C# 코드 입니다.
참고하세요.

실행 결과입니다.(Linq 패드를 이용하여 출력한 결과입니다.)
원본 테이블 => Pivot 초기화 테이블 => Pivot 결과물
pivot

DataTable dt = new DataTable();
dt.Columns.Add("Key");
dt.Columns.Add("Value");

dt.Rows.Add(new[] {"US","18"});
dt.Rows.Add(new[] {"EN","17"});
dt.Rows.Add(new[] {"RU","16"});
dt.Rows.Add(new[] {"RU","16"});
dt.Rows.Add(new[] {"US","18"});
dt.Rows.Add(new[] {"US","15"});
dt.Rows.Add(new[] {"FR","15"});

DataTable newdt = new DataTable();
newdt.Columns.Add("Key");
List keyArr = dt.AsEnumerable()
				.Select(r => r[0].ToString()).Distinct().ToList();
keyArr.ForEach(v => newdt.Rows.Add(new[]{v}));
List valueArr = dt.AsEnumerable()
				.Select(r => r[1].ToString()).Distinct().OrderBy(r=>r).ToList();
valueArr.ForEach(v => {
		DataColumn c = new DataColumn(v,typeof(int));
		c.DefaultValue = 0;
		newdt.Columns.Add(c);
	}
);

var group = dt.AsEnumerable().GroupBy(r => r[0], r => r[1]).ToList();

Dictionary<string,ValueTuple[]> pivot = dt.AsEnumerable().GroupBy(r => r[0], r => r[1])
	.ToDictionary(g => g.Key.ToString(), g => g.GroupBy(sg => sg).Select(sg => (sg.Key.ToString(),sg.Count())).ToArray());

foreach(DataRow row in newdt.Rows)
{
	foreach(var t in pivot[row["Key"].ToString()])
	{
		row[t.Item1] = t.Item2;
	}
}
2 Likes