有没有一种方法可以展平此SQL数据集?

时间:2020-09-17 16:23:04

标签: sql sql-server pivot aggregate-functions

我在临时表中得到以下结果:

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”值。

4 个答案:

答案 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操作是一种虚拟操作。每个组中只有一个匹配行,您可以轻松使用minmax。但是求和可以让您处理倍数。

答案 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