2011-08-06 25 views
0

は私が最初の2行になるだろう一度に2つのレコードを返すことによって、ページング呼び出しを行うとき、私はこのSQLソート/ページング質問質問

 
ID Col1 Col2 
1  a  11 
2  b  22 
3  c  33 
4  d  44 
5  e  55 

ように旋回ソートデータセットを持っているとしましょう。

私のデータセットは、私が最初の例のように同じデータを返すSQL文を書きたい

 
ID Col  Val 
1  Col1 a 
2  Col1 b 
3  Col1 c 
4  Col1 d 
5  Col1 e 
1  Col2 11 
2  Col2 22 
3  Col2 33 
4  Col2 44 
5  Col2 55 

のように見えるようにデータをピボット私は、同じデータを返すようにしたいと言うではないことができます最初にデータをピボットする必要はありません。

いくつかの追加のシャロン

1)n列だけではなく、2

2があるかもしれません)Ttがまた、すべての列にフィルタをサポートする必要があります。この部分はすでに解決済みです。

 
Filter on pivoted data 
WHERE Col1 in ('a', 'b', 'c') 
AND Col2 in ('11', '22') 

Filter on unpivoted data 
WHERE (Col = 'Col1' and Val in ('a', 'b', 'c')) or Col != 'Col1') 
AND (Col = 'Col2' and Val in ('11', '22')) or Col != 'Col2') 

Both filters return the same results. 

フィルタ部分はすでに分かっていますが、私は並べ替えとページングに固執しています。

+0

私が検討しているオプションの1つは、ROW_NUMBERを使用し、それを並べ替えてページすることです。 –

答えて

1

SQLは、このような操作を標準でサポートしていません。データの再フォーマットのために任意の数のカラムを処理したい場合は、PerlのDBIインタフェースのようなものを使用して、テーブルのカラム名を教えてください。そこからテーブル作成を生成することができます。

INSERT INTO newtable (id, col, val) 
SELECT id, 'Col1', Col1 from oldtable 
UNION 
SELECT id, 'Col2', Col2 from oldtable; 

ちょうどあなたが含めたい列ごとに追加UNION SELECT...を作成:挿入が形を取るでしょう、あなたの第二のテーブルを作成するに

フィルタクエリは、不必要に複雑にしています。クエリ:

SELECT * FROM newtable 
WHERE (Col = 'Col1' and Val in ('a', 'b', 'c')) or Col != 'Col1') 
AND (Col = 'Col2' and Val in ('11', '22')) or Col != 'Col2') 

は、他人に干渉しない

SELECT * from newtable 
WHERE (Col = 'Col1' and Val in ('a','b','c')) 
    OR (Col = 'Col2' and Val in ('11','22') ) 

それぞれ別々のOR D句のように書き換えることができます。

私は人々がなぜそのような悲惨さをSQLで動作させようとしているのかも理解していません。合理的なスキーマをキー/バリューストアに似たものにしようとしているようです。現在、子供たちと一緒に怒っているかもしれませんが、良いデータモデリングでSQLの力をいかに活用するかを実際に試してみるべきです。