sql >> データベース >  >> RDS >> Oracle

2つの長い列をいくつかの列のペアに分割するSQLステートメントはありますか?

    これのボーナスは、より多くのデータが得られた場合、必要に応じてより多くの水平列を作成するだけで、12行のデータを超えることはありません。 「in-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. oraclesqlスクリプトスプールファイルの作成方法

    2. MySQLデータベースにAES暗号化情報を保存する方法

    3. 'group'列はどういうわけか構文エラーを引き起こします

    4. 条件付き注文