如何解决有没有一种方法可以展平此SQL数据集?
我在临时表中得到以下结果:
CountyName BatchNumber TotalResult
countyA 6294 69
countyA 6295 298
countyB 6295 12
countyC 6294 36
countyC 6295 32
此表在“ BatchNumber”列中将始终包含2个(并且只有2个)值。我想以以下格式获取结果列表:
CountyName Batch1 Batch2
countyA 69 298
countyB null 12
countyC 36 32
这在SQL中可行吗?我知道很容易获取最小和最大“ TotalResult”值的扁平列表,但是我想要的是基于最小和最大“ BatchNumber”的“ TotalResult”值。
解决方法
with data as (
select min(BatchNumber) as Batch1,max(BatchNumber) as Batch2
from T
)
select
CountyName,sum(case when BatchNumber = Batch1 then TotalResult end) as Batch1,sum(case when BatchNumber = Batch2 then TotalResult end) as Batch2
from T cross apply data
group by CountyName;
sum
操作是一种虚拟操作。每个组中只有一个匹配行,您可以轻松使用min
或max
。但是求和可以让您处理倍数。
这只是条件聚合,但是使用DENSE_RANK
而不是列的值:
--Sample data
WITH VTE AS(
SELECT *
FROM (VALUES('countyA',6294,69),('countyA',6295,298),('countyB',12),('countyC',36),32))V(CountyName,BatchNumber,TotalResult)),--Solution
DR AS(
SELECT CountyName,TotalResult,DENSE_RANK() OVER (ORDER BY BatchNumber ASC) AS DR
FROM VTE)
SELECT CountyName,MAX(CASE DR.DR WHEN 1 THEN TotalResult END) AS Batch1,MAX(CASE DR.DR WHEN 2 THEN TotalResult END) AS Batch2
FROM DR
GROUP BY CountyName;
,
将ROW_NUMBER
与透视逻辑一起使用:
WITH cte AS (
SELECT *,ROW_NUMBER() OVER (PARTITION BY CountyName ORDER BY BatchNumber) rn
FROM yourTable
)
SELECT
CountyName,MAX(CASE WHEN rn = 1 THEN TotalResult END) AS Batch1,MAX(CASE WHEN rn = 2 THEN TotalResult END) AS Batch2
FROM cte
GROUP BY
CountyName
ORDER BY
CountyName;
请注意,这不会生成您期望的 exact 输出。但是,对于countyB
,它只有一个批号,在报告单个值的位置似乎是任意的。
只是因为我没有看到PIVOT选项
示例
Select *
From (
Select CountyName,Value = TotalResult,Item = concat('Batch',row_number() over (partition by CountyName order by BatchNumber) )
From YourTable
) src
Pivot ( max(Value) for Item in ([Batch1],[Batch2]) ) pvt
返回
CountyName Batch1 Batch2
countyA 69 298
countyB 12 NULL
countyC 36 32
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。