Sql 查询不同的行值并分隔为不同的列
我有一个表,其中包含以下内容:Sql 查询不同的行值并分隔为不同的列,sql,pivot,sybase,Sql,Pivot,Sybase,我有一个表,其中包含以下内容: Customer ID Customer type --------- -------- 123 A 123 alpha 123 Beta 456 B 456
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查询来实现这一点吗?我不相信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
看
注意:我发现第一列数据
CustomerType
存在潜在问题。我的建议是将其与其他值单独列在一列中。这样就不会参与行编号()
赋值,更容易保证出现正确的值 我建议您规范化数据模型。很明显,“A”和“Alpha”是不同类型的数据值(它们描述不同的东西),但它们在同一个字段中,这会给您带来各种各样的问题。以a为例,它对涉及的概念进行了很好的讨论
基本上,您希望得到的结果是在一个单独的表中包含alpha和beta类型的值,您可以通过客户ID和客户类型输入这些值。这是我试图在实时数据库上实现的一个示例。我的实时数据库完全正常化了。关于如何解决上述问题,您还有其他建议吗?因此,因为它是一个实时数据库,我知道您可能没有自由解决规范化问题。但是,即使数据库的其余部分得到了很好的规范化,[Customer type]的使用方式也没有得到规范化。这就是为什么此表中有多个客户条目,例如123。如果Sybase有PIVOT,您可以使用它。您在这里使用的是row_number()函数。我有Sybase 11。这在Sybase ASE 11中是否有效。@user726720如果您没有
行号()
,则可以通过一系列联接来实现。我将尝试稍后发布一个版本