इसके लिए बोनस यह है कि यदि आप अधिक डेटा के साथ समाप्त होते हैं, तो यह आवश्यकतानुसार अधिक क्षैतिज कॉलम बनाएगा, लेकिन डेटा की 12 पंक्तियों से अधिक कभी नहीं जाएगा। यदि आपको कभी भी अधिक डेटा प्रदर्शित करने की आवश्यकता हो तो "इन-एसक्यूएल" तरीके में कोड परिवर्तन की आवश्यकता होगी।
अस्वीकरण :यह पूरी तरह से ऑफ-द-कफ है (सी # जैसा कि मैं इसका उपयोग कर रहा हूं)। ऐसा करने के लिए शायद बहुत बेहतर तरीके हैं (लिंक?) तर्क बहुत करीब होना चाहिए, लेकिन यह आपको डेटा की उस सूची का उपयोग अन्य उद्देश्यों के लिए इस बहुत ही संकीर्ण रूप से केंद्रित प्रदर्शन की तुलना में लचीलापन देता है।
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!
वैकल्पिक संस्करण :आवश्यकता के लिए कि val1 ==48 सेल 48 में जाता है (टिप्पणियां देखें)
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!