Oracle
 sql >> база данни >  >> RDS >> Oracle

Има ли SQL израз, който ще разбие това, което биха били 2 дълги колони, на няколко двойки колони?

Бонус към това е, че ако получите повече данни, той просто ще изгради повече хоризонтални колони, ако е необходимо, но никога няма да надхвърли 12 реда с данни. Начинът "в SQL" ще изисква промени в кода, ако някога трябва да покажете повече данни.

Отказ от отговорност :Това е напълно нестандартно (C#, тъй като съм свикнал с това). Вероятно има много по-добри начини да направите това (Linq?) Логиката трябва да е доста близка, но това ви дава гъвкавостта да използвате този списък с данни за други цели, различни от този много тясно фокусиран дисплей.

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!


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Имам нужда кодът на цената да бъде поискан само ако тип :=E

  2. Защо CONNECT BY LEVEL в таблица връща допълнителни редове?

  3. Съвпадение на Oracle SQL Regexp_replace

  4. ORA-04021:възникна изчакване при изчакване за заключване на обекта

  5. Как мога да разбера дали имам необвързана работа в транзакция на Oracle?