我想要下表中的交叉表。
交叉表应该如下所示
数据透视表似乎并不能解决问题,因为一次只能使用一列。但在我们的例子中,我们正在处理 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/