sql >> Database >  >> RDS >> Oracle

Is er een SQL-instructie die 2 lange kolommen in verschillende paren kolommen zal breken?

Een bonus hierbij is dat als je meer gegevens hebt, het alleen meer horizontale kolommen zal bouwen als dat nodig is, maar nooit meer dan 12 rijen gegevens gaat gebruiken. De "in-SQL"-manier vereist codewijzigingen als u ooit meer gegevens moet weergeven.

Disclaimer :Dit is totaal off-the-cuff (C# zoals ik gewend ben). Er zijn waarschijnlijk veel betere manieren om dit te doen (Linq?) De logica zou redelijk dichtbij moeten zijn, maar dit geeft je de flexibiliteit om die lijst met gegevens voor andere doeleinden te gebruiken dan deze zeer nauw gerichte weergave.

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!

ALTERNATE versie :Voor vereiste dat val1 ==48 in cel 48 gaat (zie opmerkingen)

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. Fout in MySQL-verbinding bij toegang tot een externe server

  2. Incrementele statistieken verzamelen in 11g

  3. Datums van een dag van de week in een datumbereik ophalen

  4. Worstelen met een MySQL-database met telefoonnummers