【问题标题】:Dynamic Pivot of multi-columns based on rank of row Oracle and SQL Server基于行列Oracle和SQL Server的多列动态透视
【发布时间】:2021-05-17 10:37:57
【问题描述】:

我的数据如下:

我正试图把它变成这个形状:

我已经看到这个解决方案Multi Column Pivot SQL Server,但它使用硬编码值,这不是我的情况,因此我认为使用动态枢轴会更安全。 有人可以帮忙吗?

【问题讨论】:

  • 您的主题引用了两个不同的数据库,Oracle 和 SQL Server。您的标签仅引用一个。您谈到想要一个动态数据透视,这意味着您希望结果中的列数根据数据而变化,但您实际上并没有说明这一点。进行动态数据透视意味着您将在 PL/SQL 和/或 T-SQL 中构建适当的 SQL 语句并执行它,这意味着您需要为这两个数据库提供完全不同的解决方案。这是可以接受的,还是您正试图找到一个对两者都适用的单一解决方案?
  • 1.我在两个单独的数据库上要解决同样的问题,这就是我询问两个数据库的原因
  • 2.可能同意这个确切的例子动态支点是矫枉过正 - 但我不知道有多少排名城市,也许 2 可能 100 - 因此寻找具有动态支点的解决方案
  • 动态枢轴很难调试。在 rownumber 上做不是动态的,应该相当简单,有很多例子
  • 为什么用图片替换数据和结果的文本?在您的问题中包含文本数据比使用图像更可取。排名城市的数量是否有上限?如果是这样,您可以拥有一个静态枢轴,它通常比动态解决方案更容易处理。如果您确实想要一个动态解决方案,您是否可以使用完全不同的 Oracle 和 SQL Server 解决方案?

标签: sql sql-server oracle dynamic pivot


【解决方案1】:

您可以使用条件聚合:

select id_card_no,
       max(case when city_rank = 1 then city end) as city_1,
       max(case when city_rank = 1 then visitratio end) as visitratio_1,
       max(case when city_rank = 2 then city end) as city_2,
       max(case when city_rank = 2 then visitratio end) as visitratio_2
from t
group by id_card_no;

这是标准 SQL,应该适用于任何数据库。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-04
    • 1970-01-01
    • 2022-01-06
    • 1970-01-01
    • 1970-01-01
    • 2013-09-10
    • 2013-01-25
    相关资源
    最近更新 更多