標籤:

請教一個SQL,詳情請看問題補充?

有一結果集,如下:

怎麼把它變成如下:

求SQL,ORACLE資料庫。


sql語法太複雜一下子想不起來我就不寫了,主要思想如下

1:找出所有非空的&,命名為a

a a1 0

a a2 1

a a3 2

2:找出所有非空的&,命名為b

a a6 0

a a7 1

3:找出所有非空的&,命名為c

a a4 0

a a5 1

上面的id都是行號,可以先where之再rowid一下自動得到

4:把他們按照id給outer join起來,把id幹掉,就得到下表了。

題外話,根據行的某種奇怪的順序來搞業務,證明你要麼SQL寫得爛,要麼DB設計的爛,總之這種做法就是不對的,你應該回去想想。


這個問題我已經舉報了一個上午了,到目前為止勤勞勇敢到處刪帖封人的知乎運營還沒有處理這個問題。

如此,既然知乎打算把自己往百度知道來打造,用戶也只能配合。那麼,就確實的回答這麼個明顯代為完成的個人任務吧。

正如 @vczh 所說,這個問題需要藉助行號才能解決,而且,對於數據格式的組織,根本就不應當交由關係型資料庫來處理,就像你不應當把吸塵器當做電吹風用一樣,儘管它吹出的熱風足夠把頭髮吹乾。

SQL Server藉助ROW_NUMBER()函數的SQL如下:

SELECT ISNULL( A.type, ISNULL( B.type, C.type ) ) AS type, jan, feb, mar
FROM
(
SELECT ROW_NUMBER() OVER ( PARTITION BY type ORDER BY jan ) AS id, type, jan
FROM Testdata WHERE jan IS NOT NULL
) AS A

FULL JOIN
(
SELECT ROW_NUMBER() OVER ( PARTITION BY type ORDER BY feb ) AS id, type, feb
FROM Testdata WHERE feb IS NOT NULL
) AS B
ON A.type = B.type AND A.id = B.id

FULL JOIN
(
SELECT ROW_NUMBER() OVER ( PARTITION BY type ORDER BY mar ) AS id, type, mar
FROM Testdata WHERE mar IS NOT NULL
) AS C
ON B.type = C.type AND B.id = C.id

ORDER BY type


我用輪子哥的思路 試著做了一下,結果如下:

select *
from (select rownum id, t.deptno
from scott.emp t
where t.deptno is not null) a
full join (select rownum id, t.comm
from scott.emp t
where t.comm is not null) b
using (id)
full join (select rownum id, t.sal
from scott.emp t
where t.sal is not null) c
using (id);

說真的,這種功能真心是要多扯淡有多扯淡啊……


不知道Oracle有沒有臨時表,我一直用的SQL Server的,數據量大的時候可以先Where篩選掉一部分,然後使用臨時表處理


樓主去http://itpub.net 。 問專業問題去專業論壇,答案也會專業點。


頂一樓,他的思路完全正確!實現方法很多,可以考慮使用分析函數。


推薦閱讀:

為什麼用SQL而不是Excel+VBA?
sql中為什麼select要放在from之前?
如何優雅地寫SQL?
為什麼公司不準使用SQL語句查詢的「*」?
sql語句面試問題?

TAG:SQL |