SQL 기능으로 행렬을 바꾸는 방법도 PIVOT, DECODE, CASE 등 여러 가지가 있지만… 경우에 따라서는 UNION을 수반하는 상당한 노가다 작업과 막대한 코드를 만들어내는 지루한 작업이 된다.
상기와 같은 경우 C# 프로그램 내에서 리턴을 받은 테이블을 이용하여 행렬을 바꾸어 결과 데이터 테이블을 생성하는 것이 보다 효율적이지 않을까.
경우에 따라서는 SQL로는 불가능한(?) 대분류 추가 기능도 구현했으므로…(웃음)
참고) C# DataTable 및 DataSet.xsd 내에서 컬럼명을 한글로만 or 숫자로만 사용 가능, 차트나 표 등과 Merge할 때 상당히 중요하게 사용하실 수 있습니다~^^
- 소스테이블
2. 변환함수 사용법//데이터만 변환하고 리턴 dt=ConvertXY(소스테이블);gvList.Columns.Clear( );;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;♪
3. 변환 함수
// category & columntype은 선택적 파라미터로 설정하고 기본값은 null로 처리 public static Data Table ConvertXY(Data Tableorg, stringcat=”, stringcol_type=”) {DataTabledst=new DataTable( ); DataRowdr; DataColumndc; intidx; // 분류값 추가 여부에 따른 컬럼 생성 위치
// 기존 테이블의 컬럼명은 새 테이블의 첫 번째 컬럼 값으로 해야 하므로 ‘CATx’ 컬럼으로 명명 if(string.IsNullOrWhiteSpace(cat))//선택적 인수에 값이 없으면 {idx=1;dc=dst.Columns.Add(“CAT1”);else{idx=2;dc=dst.Columns.Add(“CAT1”)//선택적 인수에 값이 없으면 {idx=1;dc=dc 既存dc 1dc ddcoldcumdc .dc .dc (dcolumns.AdToString(), type of(decimal)); break; default: dc=dst.Columns.Add(org.Rows[r][0], ToString(string)); break;}
// 첫 번째 컬럼은 컬럼명으로 변환되었으므로 두 번째 컬럼부터 데이터 생성 for(intc=1;c<org.Columns.Count;c+){dr=dst.NewRow();if(cat==””){dr[0]=org.Columns[c].ColumnName;}else{dr[0]=cat;dr[1]=org.Columns[c].ColumnName;};for(intr=0;r<org.Rows.Count;r+)dr[r+idx]=org.Rows[r] [c];// 인덱스 위치에서 컬럼 생성
dst.Rows.Add(dr);}dst.AcceptChanges( );return dst;}
#Reverse #Inverse #Change #Exchange #Cross #Convert