【问题标题】:MS SQL combining horizontally select results for the same tableMS SQL 合并同一张表的水平选择结果
【发布时间】:2020-08-27 10:28:53
【问题描述】:

我有一个包含以下列的表:时间、投资组合 ID、MTD,其中每个投资组合 ID 的 MTD 随时间而变化。我想创建一个显示以下内容的选择:portfolioID、时间 1 的 MTD、时间 2 的 MTD 等。

我不知道如何实现以下结果:

请指教!!

【问题讨论】:

  • 请标记您的数据库。

标签: sql pivot


【解决方案1】:

如果您事先知道可能的 time 值,则可以使用条件聚合:

select
    portfolioid,
    max(case when time = '20200803' then mtd end) mdt_for_20200803,
    max(case when time = '20200804' then mtd end) mdt_for_20200804,
    max(case when time = '20200805' then mtd end) mdt_for_20200805
from mytable
group by portfolioid

您可以使用更多条件表达式扩展select 子句以处理更多可能的值。

如果您事先不知道这些值,那么纯 SQL 无法执行您想要的操作(查询总是返回相同的列集)。您需要动态 SQL,这更繁琐,并且高度依赖数据库。

【讨论】:

  • 完美运行。在这种情况下,为什么“case when”在没有 max 的情况下不起作用?谢谢!
  • @Łukasz:我们希望每个投资组合只有一条记录,因此我们需要聚合。
【解决方案2】:

你可以使用pivot

SELECT  *
from t2
pivot(MAX(MTD) for [Time]  in ([20200803] , [20200804], [20200805])) pv

这里使用 Max(MTD),因为如果您有重复/多个相同的行,则需要选择单个值(Max 或 SUM 或 AVG 等)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-20
    • 1970-01-01
    • 2019-11-23
    • 1970-01-01
    • 1970-01-01
    • 2018-09-24
    • 1970-01-01
    相关资源
    最近更新 更多