sql - 如何在交叉表中获取多列

标签 sql sql-server sql-server-2012 pivot

我想要下表中的交叉表。

enter image description here

交叉表应该如下所示

enter image description here

数据透视表似乎并不能解决问题,因为一次只能使用一列。但在我们的例子中,我们正在处理 4 个不同的列。 (付款、月份、年份、免费) 我通过将这 4 列拆分为四个不同的数据透视表,使用临时表并最终重新组合获得的数据来解决这个问题。但这非常复杂、漫长且令人困惑,总之不太好...... 年份和月份应以升序形式显示,正如您在上面的交叉表中看到的那样。

我已经寻找解决方案很长一段时间了,但我在任何地方都找不到同样的问题。 如果有人能给我一个简短而优雅的解决方案,我将非常感激。

http://www.sqlfiddle.com/#!18/7216f/2你可以看到问题定义。

谢谢!

最佳答案

您可以使用 row_number() 在子查询中按日期对记录进行排名,然后使用条件聚合进行透视:

select
    ClientId,
    max(case when rn = 1 then Payment end) Payment1,
    max(case when rn = 2 then Payment end) Payment2,
    max(case when rn = 3 then Payment end) Payment3,
    max(case when rn = 1 then [Month] end) Month1,
    max(case when rn = 2 then [Month] end) Month2,
    max(case when rn = 3 then [Month] end) Month3,
    max(case when rn = 1 then [Year] end) Year1,
    max(case when rn = 2 then [Year] end) Year2,
    max(case when rn = 3 then [Year] end) Year3,
    max(case when rn = 1 then FreeOfCharge end) FreeOfCharge1,
    max(case when rn = 2 then FreeOfCharge end) FreeOfCharge2,
    max(case when rn = 3 then FreeOfCharge end) FreeOfCharge3
from (
    select 
        t.*,
        row_number() over(partition by ClientId order by [Year], [Month]) rn
    from mytable t
) t
group by ClientId

关于sql - 如何在交叉表中获取多列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59523637/

相关文章:

sql - 动态 SQL 存储过程中的单引号处理

sql - 为什么子查询和join这么慢

sql-server - 哪个更快?多个 DELETE 语句或单个 DELETE 语句使用 "IN (' x', '' y')"

sql - 复制具有主从关系的多条记录

sql - 如何使用 "time"字段在 postgresql 中按小时分组?

sql-server - 识别 SQL Server 性能问题

sql - 基于连续值的累计和

sql - 在为自动完成/迭代搜索提供结果时,您如何优化数据库性能?

mysql - 插入具有不同选择条件的多个值?

sql - 我们可以使用校验和来检查该行是否已更改(sql server)?