Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Apakah ada pernyataan SQL yang akan memecah apa yang akan menjadi 2 kolom panjang menjadi beberapa pasang kolom?

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!


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tampilan terwujud dengan Oracle

  2. ORA-28860:Kesalahan SSL fatal saat menggunakan UTL_HTTP?

  3. Otentikasi dengan kunci publik dan cx_Oracle menggunakan Python

  4. Mengapa saya tidak dapat menggunakan variabel bind dalam pernyataan langsung yang dieksekusi?

  5. Bagaimana cara menetapkan nilai DEFAULT bersyarat ke kolom di Oracle tanpa menggunakan pemicu?