2016-03-07 23 views
0

我正在尋找任何邏輯來將這些數據轉換爲以下格式。sql中的重複記錄相對於列值

但我無法找到任何邏輯來實現這一點在SQL中。

鑑於表

ID     Country   AreaDiscount  Email 
AB0215000001   Belgium   120 cm + 10%  [email protected] 
            130 cm + 20%  [email protected] 
            140 cm + 30%  [email protected] 
AB0215000002   Spain   220 cm + 30%  [email protected] 
            1420 cm + 30%  [email protected] 
            1520 cm + 10%  [email protected] 

要求

ID     Country   AreaDiscount 
AB0215000001   Belgium   120 cm + 10% 
AB0215000001   Belgium   130 cm + 20% 
AB0215000001   Belgium   140 cm + 30%             
AB0215000002   Spain   220 cm + 30% 
AB0215000002   Spain   1420 cm + 30% 
AB0215000002   Spain   1520 cm + 10% 

我能得到任何邏輯或建議,以實現這一目標?

謝謝! :)

+0

SQL表代表*無序*套。你有代表排序的專欄嗎? –

+0

@戈登林諾,沒有戈登!我已經提到了我擁有的完全相同的數據.... – Kate

+0

數據庫中是否已經存在給定的表?有更多的專欄嗎?主要關鍵是什麼? – Recoil

回答

0

我完全戈登·利諾夫同意。

你可以試試下面的辦法,這比他的回答有點不同:

SELECT NVL(ID, NVL(LAG(ID IGNORE NULLS) OVER(ORDER BY ROWID), ID)) AS ID, 
     NVL(COUNTRY, NVL(LAG(COUNTRY IGNORE NULLS) OVER(ORDER BY ROWID), COUNTRY)) AS COUNTRY, 
     AREADISCOUNT 
FROM TAB1 T 
ORDER BY ROWID; 

但要小心。在這個問題上使用rowid並不是真正的「最佳實踐」,你必須詳細檢查結果的正確性!

更新

通過附加列,您可以在此進行分組/排序:

SELECT NVL(ID, NVL(LAG(ID IGNORE NULLS) OVER(ORDER BY EMAIL), ID)) AS ID, 
     NVL(COUNTRY, NVL(LAG(COUNTRY IGNORE NULLS) OVER(ORDER BY EMAIL), COUNTRY)) AS COUNTRY, 
     AREADISCOUNT, 
     EMAIL 
FROM TAB1 T 
ORDER BY ID, AREADISCOUNT; 
+0

正如@Recoil指出的那樣,這不是對'rowid'的正確使用。 Oracle文檔甚至沒有假設「rowid」以任何方式反映插入順序(因爲它沒有)。 –

1

假設你有一個指定排序的列,您可以使用lag(. . . ignore nulls)

select lag(id ignore nulls) over (order by orderingcol) as id, 
     lag(country ignore nulls) over (order by orderingcol) as country, 
     areadiscount 
from t; 
+0

你的意思是如果我創建任何rounum列組ID,這可以幫助我實現這一目標嗎?你在談論這個訂單嗎? – Kate

+0

@Kate。 。 。是。 SQL表沒有內在排序,所以你的行可以以任何順序。這使得你無法做到你想要的 - 除非另一列指定了排序。 –

+0

我已經更新了這個問題。現在我在數據集中還有一列。請現在檢查....現在有電子郵件ID列。 – Kate