2011-12-15 6 views
0

私のデータセットはEAVフォーマットによく似ていませんが、多少似ています。ここでのデータです:次のように私は必要なフォーマットでrows-to-col(EAVからリレーショナル) - SQLクエリに似ています

original data

がある:私は上記の形式のデータを必要とするすべてのEN_NOグループのために

data format needed

。 EN_NO> 1でグループ化する場合、そうでない場合には再プロダクティブプロダクトキーがリスペスティブプロダクトキーに移動する必要があります(EN_NO 4および5など)。

私は明らかに希望です。データはQracleテーブルにありますので、必要な形式でデータを取得するためのクエリを提案してください。

おかげで、 プラカシュ

答えて

0

は、私は非常にあなたのテーブル構造を変更することをお勧めします。現在、1つのフィールドに2つの情報が結び付けられています。これはSQLのアンチパターンであり、特定の最適化をユーザーに提供するOracleの能力を破壊します。

代わりに、「PROD_KEY」を2つのフィールド(PRODUCT_TYPE = Prod_Aなど)(SUB_PRODUCT_ID = 1,2,3など)に分割することを検討してください。または、データベース全体の潜在的な変更を少なくするには、現行の表にPRODUCT_TYPEを追加するだけです。あなたが出力として必要な、特に何の列を知っているとき、これが機能する

SELECT 
    EN_NO, 
    PROD_KEY, 
    CASE WHEN (EN_NO < 4) AND (LEFT(PROD_KEY, 6) = 'Prod_A') THEN PROD_KEY ELSE NULL END AS Prod_A, 
    CASE WHEN (EN_NO < 4) AND (LEFT(PROD_KEY, 6) = 'Prod_B') THEN PROD_KEY ELSE NULL END AS Prod_B, 
    CASE WHEN (EN_NO < 4) AND (LEFT(PROD_KEY, 6) = 'Prod_C') THEN PROD_KEY ELSE NULL END AS Prod_C, 
    PROD_QTY 
FROM 
    yourTable 

...あなたの現在の構造を使用して、言った


Prod_Dなどに適応するコードが必要な場合は、コード(動的SQL)を記述するコードを記述する必要があります。

0

あなたが見せているのはピボットテーブルです。テーブル内の個別のデータ値に対応する列を自動的に追加するクエリが必要な場合は、不運です。 SQLはこれをサポートしていません。クエリを準備するとき(テーブル内のデータ値を読み込む前)に列を認識して固定する必要があります。

はこれを行うには、個別のprod_key値のリストを取得する必要があります(または:文字までのサブストリング):

SELECT DISTINCT LEFT(PROD_KEY, 6) FROM yourTable; 

をそしてシリーズにこの値のリストを有効にするアプリケーションのコードを書きます@Demsに記述されているように、動的SQLステートメントの列式を使用します。

もう1つの選択肢は、テーブルに存在する生データをフェッチし、それを反復処理して一度に1つのデータ値にまとめる表形式のレポートにアプリケーションコードをグループ化することです。

どちらの方法でも、取り出したい別個のprod_keyタイプのリストがわからない限り、アプリケーションコードを記述する必要があります。

関連する問題