sql >> Databáze >  >> RDS >> Oracle

Existuje příkaz SQL, který rozdělí to, co by byly 2 dlouhé sloupce, na několik párů sloupců?

Bonusem k tomu je, že pokud skončíte s více daty, podle potřeby vytvoří více vodorovných sloupců, ale nikdy nepřekročí 12 řádků dat. Způsob "in-SQL" bude vyžadovat změny kódu, pokud někdy budete potřebovat zobrazit více dat.

Odmítnutí odpovědnosti :Tohle je úplně mimo mísu (C#, na to jsem zvyklý). Pravděpodobně existují mnohem lepší způsoby, jak toho dosáhnout (Linq?) Logika by měla být docela blízko, ale to vám dává flexibilitu používat tento seznam dat pro jiné účely, než je toto velmi úzce zaměřené zobrazení.

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!

ALTERNATIVNÍ verze :Pro požadavek, aby hodnota1 ==48 byla uvedena v buňce 48 (viz komentáře)

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. Křížový dotaz s dynamickými sloupci v SQL Server 2005 nahoru

  2. Moje doktrína je opravdu pomalá. Jednoduchý dotaz a jedna sekunda k získání výsledku

  3. Vyberte poslední řádek pomocí GROUP BY v MySQL

  4. Datum Oracle se zdá být stejné