Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Czy istnieje instrukcja SQL, która podzieli 2 długie kolumny na kilka par kolumn?

Dodatkową zaletą jest to, że jeśli uzyskasz więcej danych, w razie potrzeby zbudujesz więcej poziomych kolumn, ale nigdy nie przekroczysz 12 wierszy danych. Sposób "in-SQL" będzie wymagał zmian kodu, jeśli kiedykolwiek będziesz musiał wyświetlić więcej danych.

Zastrzeżenie :To jest całkowicie nietuzinkowe (C#, ponieważ do tego jestem przyzwyczajony). Prawdopodobnie są na to znacznie lepsze sposoby (Linq?) Logika powinna być dość zbliżona, ale daje to elastyczność w używaniu tej listy danych do innych celów niż ten bardzo wąsko skoncentrowany wyświetlacz.

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!

Wersja ALTERNATYWNA :Dla wymagania, aby val1 ==48 znajdowała się w komórce 48 (patrz komentarze)

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. Mieszanie USING i ON w Oracle ANSI join

  2. Metoda gromadzenia:funkcja COUNT w bazie danych Oracle

  3. Oracle RAC w chmurach innych firm

  4. Funkcje a procedury w Oracle

  5. Konwertuj każdy znak w ciągu na wiersz