2012-12-23 106 views
0

我有一個具有下列內容的表格:查詢不同的列值,並分成不同的列

Customer ID    Customer type     
---------    -------- 
123      A 
123      alpha 
123      Beta 
456      B 
456      BGamma 
456      BBeta 

我要實現以下目標:

Customer_ID Customer_type  Customer_E1 Customer E_2 Customer E_3 
---------  -----------  ----------- ------------- ------------- 
123     A    Alpha   Beta 
456     B    BGamma   BBeta 

能否請你幫我一個用Sybase查詢來實現這個?

回答

1

我不相信Sybase有一個PIVOT函數,這是你正在嘗試做的。所以,你可能能夠實現這樣的事情,它使用聚合函數與CASE聲明:

select customerid, 
    max(case when rn = 1 then customertype else null end) CustomerType, 
    max(case when rn = 2 then customertype else null end) Customer_E1, 
    max(case when rn = 3 then customertype else null end) Customer_E2 
from 
(
    select CustomerID, CustomerType, 
    row_number() over(partition by CustomerID order by CustomerID) rn 
    from yourtable 
) src 
group by customerid 

SQL Fiddle with Demo

注:我看到一個潛在的問題與數據CustomerType的第一列。我的建議是將其與其他值分開。那麼這將不會參與row_number()分配,並且將更容易保證將顯示正確的值。

+0

謝謝。我會明天嘗試這個,並在這裏發佈,如果它的工作.. – user726720

+0

你在這裏使用row_number()函數。我已經得到了Sybase 11.如果你沒有'row_number()',這可以在Sybase ASE 11. – user726720

+0

@ user726720中工作,那麼你可以通過一系列連接來完成。我將嘗試稍後發佈一個版本 – Taryn

0

讓我建議你規範你的數據模型。顯然,'A'和'Alpha'是不同類型的數據值(它們描述的是不同的東西),但是你將它們放在同一個領域,這會給你帶來各種各樣的問題。以一個look at this article on database normalization,這有一個很好的討論涉及的概念。

基本上,您最終希望在單獨的表中使用alpha和beta類型值,您可以通過Customer ID和Customer Type鍵入。

+0

這是我試圖在實時數據庫上實現的一個示例。我的活動分貝完全正常化。關於如何解決上述問題,你有沒有其他方法? – user726720

+0

所以,因爲它是一個實時數據庫,我知道你可能沒有解決規範化問題的自由。但是,即使數據庫的其餘部分已經正常化,[客戶類型]的使用方式也沒有被標準化。這就是爲什麼你在這張表中爲123這樣的客戶提供了多個條目的原因。 – DWright

+0

如果Sybase有PIVOT,那麼你可以使用它。 – DWright