sql >> Database teknologi >  >> RDS >> Oracle

Er der en SQL-sætning, der vil opdele, hvad der ville være 2 lange kolonner, i flere par af kolonner?

Bonus til dette er, at hvis du ender med flere data, vil det bare bygge flere vandrette kolonner efter behov, men aldrig gå over 12 rækker med data. "In-SQL"-måden vil kræve kodeændringer, hvis du nogensinde har brug for at vise flere data.

Ansvarsfraskrivelse :Dette er fuldstændig off-the-manchet (C#, da det er, hvad jeg er vant til). Der er sandsynligvis meget bedre måder at gøre dette på (Linq?) Logikken burde være ret tæt på, men dette giver dig fleksibiliteten til at bruge den liste over data til andre formål end denne meget snævert fokuserede visning.

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!

ALTERNATIVE version :For krav om, at val1 ==48 går i celle 48 (se kommentarer)

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. Hvordan kører man en lagret procedure i sql server hver time?

  2. Fejl (ORA-21700) med tabeloperatør efter opdatering til Oracle 12.2 fra 12.1

  3. Hvordan begrænser man inkluderer på en belongsToMany-forening i Sequelize JS?

  4. SQL Join på null-værdier