查询不同的行值并分成不同的列

时间:2012-12-23 17:19:17

标签: sql pivot sybase

我有一张表格,其中包含以下内容:

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查询吗?

2 个答案:

答案 0 :(得分: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()分配,并且更容易保证将出现正确的值。

答案 1 :(得分:0)

我建议您规范化数据模型。很明显,'A'与'Alpha'是不同类型的数据值(它们描述不同的东西),但是你将它们放在同一个领域,这会导致各种各样的问题。拿一个look at this article on database normalization,对所涉及的概念进行了很好的讨论。

基本上,您希望最终得到的是在单独的表中包含alpha和beta类型的值,您可以通过客户ID和客户类型键入。