Bonus untuk ini adalah jika Anda berakhir dengan lebih banyak data, itu hanya akan membangun lebih banyak kolom horizontal sesuai kebutuhan tetapi tidak pernah melebihi 12 baris data. Cara "dalam-SQL" akan memerlukan perubahan kode jika Anda perlu menampilkan lebih banyak data.
Penafian :Ini benar-benar off-the-cuff (C# seperti yang biasa saya lakukan). Mungkin ada cara yang jauh lebih baik untuk melakukan ini (Linq?) Logikanya seharusnya cukup dekat, tetapi ini memberi Anda fleksibilitas untuk menggunakan daftar data tersebut untuk tujuan lain selain tampilan yang terfokus sangat sempit ini.
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!
Versi ALTERNATIF :Untuk persyaratan bahwa val1 ==48 masuk ke sel 48 (lihat komentar)
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!