2011-08-06 72 views
0

可以說我有一個擺動分類數據集這樣SQL排序/分頁問題問

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

當我做出通過一次返回兩個記錄,我會得到的前兩行尋呼呼叫。

可以說,我想返回相同的數據,但讓我的數據集看起來像

 
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 

我想編寫一個SQL語句,將返回相同的數據在第一個例子並不透視數據但沒有首先旋轉數據。

一些額外challanges

1)有可能是N列而不是兩個

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

我正在看的一個選擇是使用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的全部功能。