sql >> Databasteknik >  >> RDS >> Oracle

Finns det en SQL-sats som kommer att dela upp vad som skulle vara två långa kolumner i flera kolumnpar?

Bonus till detta är att om du får mer data, kommer det bara att bygga fler horisontella kolumner efter behov men aldrig gå över 12 rader med data. "In-SQL"-sättet kommer att kräva kodändringar om du någonsin behöver visa mer data.

Ansvarsfriskrivning :Det här är helt off-the-manschetten (C# eftersom det är vad jag är van vid). Det finns förmodligen mycket bättre sätt att göra detta (Linq?) Logiken borde vara ganska nära, men detta ger dig flexibiliteten att använda den listan med data för andra ändamål än denna mycket snävt fokuserade 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!

ALTERNATIV version :För krav på att val1 ==48 går i cell 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. Behöver förklaring om teckentyper i PostgreSQL

  2. mysql ny användaråtkomst nekad

  3. Hur APPROX_COUNT_DISTINCT() fungerar i SQL Server

  4. PGError:ingen anslutning till servern efter inaktivitet