Een bonus hierbij is dat als je meer gegevens hebt, het alleen meer horizontale kolommen zal bouwen als dat nodig is, maar nooit meer dan 12 rijen gegevens gaat gebruiken. De "in-SQL"-manier vereist codewijzigingen als u ooit meer gegevens moet weergeven.
Disclaimer :Dit is totaal off-the-cuff (C# zoals ik gewend ben). Er zijn waarschijnlijk veel betere manieren om dit te doen (Linq?) De logica zou redelijk dichtbij moeten zijn, maar dit geeft je de flexibiliteit om die lijst met gegevens voor andere doeleinden te gebruiken dan deze zeer nauw gerichte weergave.
DataTable dt = ResultsFromSproc();
DataTable outputDt = new DataTable();
//prebuild 12 rows in outputDt
int iRows = 12;
while(iRows > 0) {
outputDt.Rows.Add(new DataRow());
iRows-=1;
}
int outputColumn = 0;
for(int i = 0; i < dt.Rows.Count; i+=1){
DataRow dr = dt.Rows[i];
if(i % 12 == 0 && i > 0) {
//add two more columns to outputDt
outputDt.Columns.Add() //Not sure but you might need to give it a name. (outputColumn+2).ToString() should work
outputDt.Columns.Add() //Not sure but you might need to give it a name. (outputColumn+3).ToString() should work
outputColumn += 1;
}
outputDt.Rows[i%12][outputColumn] = dr[0];
outputDt.Rows[i%12][outputColumn + 1] = dr[1];
}
//Step2: Bind to outputDt. Step 3: Profit!
ALTERNATE versie :Voor vereiste dat val1 ==48 in cel 48 gaat (zie opmerkingen)
DataTable dt = ResultsFromSproc();
DataTable outputDt = new DataTable();
//prebuild 12 rows in outputDt
int iRows = 12;
while(iRows > 0) {
outputDt.Rows.Add(new DataRow());
iRows-=1;
}
int outputColumn = 0;
int iMaxCell = (int)dt.Select("MAX(Val1)")[0][0];
//ASSUMING YOU HAVE ALREADY DONE AN ORDER BY Val1 in SQL (if not you need to sort it here first)
for(int i = 0; i < iMaxCell; i+=1){
DataRow dr = dt.Rows[i];
if(i % 12 == 0 && i > 0) {
//add two more columns to outputDt
outputDt.Columns.Add() //Not sure but you might need to give it a name. (outputColumn+2).ToString() should work
outputDt.Columns.Add() //Not sure but you might need to give it a name. (outputColumn+3).ToString() should work
outputColumn += 2;
}
//compare to i+1 if your data starts at 1
if((int)dr[0] == (i+1)){
outputDt.Rows[i%12][outputColumn] = dr[0];
outputDt.Rows[i%12][outputColumn + 1] = dr[1];
}
}
//Step2: Bind to outputDt. Step 3: Profit!