我有一个 SQL Server 实例,它有一个链接到 Oracle 服务器的服务器。Oracle 服务器上有一个名为的表,PersonOptions
其中包含以下数据:
╔══════════╦══════════╗
║ PersonID ║ OptionID ║
╠══════════╬══════════╣
║ 1 ║ A ║
║ 1 ║ B ║
║ 2 ║ C ║
║ 3 ║ B ║
║ 4 ║ A ║
║ 4 ║ C ║
╚══════════╩══════════╝
我需要旋转该数据,因此结果是:
╔══════════╦═════════╦══════════╦══════════╗
║ PersonID ║ OptionA ║ Option B ║ Option C ║
╠══════════╬═════════╬══════════╬══════════╣
║ 1 ║ 1 ║ 1 ║ ║
║ 2 ║ ║ ║ 1 ║
║ 3 ║ ║ 1 ║ ║
║ 4 ║ 1 ║ ║ 1 ║
╚══════════╩═════════╩══════════╩══════════╝
有什么建议么?
有几种方法可以执行此数据转换。您可以访问该
PIVOT
函数,那将是最简单的,但如果没有,那么您可以使用聚合函数和CASE
.聚合/案例版本:
请参阅带有演示的 SQL Fiddle
静态枢轴:
请参阅带有演示的 SQL Fiddle
动态版本:
如果您有已知数量的值,则上述两个版本工作得很好,但是如果您的值未知,那么您将需要实现动态 sql,并且在 Oracle 中您可以使用一个过程:
然后你返回结果,你将使用:
所有版本的结果都相同:
这在 SQL Server 语法中是等效的。根据我对 Oracle 文档的阅读,NULLIF和PIVOT似乎与它们的 SQL Server 亲属具有相同的格式。挑战将是需要静态的数据透视表,除非您像 Itzik演示的那样使查询动态化,但我不知道是否可以将其转换为 P/SQL
我更喜欢手动旋转查询,但您也可以使用
PIVOT
。