我在临时表中得到以下结果:
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”值。
答案 0 :(得分:3)
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
。但是求和可以让您处理倍数。
答案 1 :(得分:2)
这只是条件聚合,但是使用DENSE_RANK
而不是列的值:
--Sample data
WITH VTE AS(
SELECT *
FROM (VALUES('countyA',6294,69),
('countyA',6295,298),
('countyB',6295,12),
('countyC',6294,36),
('countyC',6295,32))V(CountyName,BatchNumber,TotalResult)),
--Solution
DR AS(
SELECT CountyName,
BatchNumber,
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;
答案 2 :(得分:1)
将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
,它只有一个批号,在报告单个值的位置似乎是任意的。
答案 3 :(得分:1)
只是因为我没有看到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