按年份透视 SQL Server 结果

Posted

技术标签:

【中文标题】按年份透视 SQL Server 结果【英文标题】:Pivot SQL Server results by year 【发布时间】:2020-12-27 23:22:43 【问题描述】:

我不知道如何返回旋转结果。任何帮助是极大的赞赏。我的数据如下所示:

注意 SystemCategoryID 和 DataQualityCategoryID 3 有 2019 年的记录和 2020 年的记录。我需要像这样对结果进行透视:

因为 SystemCategoryID 和 DataQualityCategoryID 3 有 2020 年的记录,它将在与上一年相同的行中返回。因此,如果有多年的数据,则仅返回当前年份和上一年。这可能吗?

【问题讨论】:

数据/T-SQL请不要使用图片,使用格式化文本。 【参考方案1】:

你可以像这样使用条件聚合:

select clientid, systemcategoryid, dataqualitycategoryid,
    max(case when year(datecaptured) = 2019 then datecaptured end) as datecaptured_2019,
    max(case when year(datecaptured) = 2019 then score        end) as score_2019
    max(case when year(datecaptured) = 2020 then datecaptured end) as datecaptured_2020,
    max(case when year(datecaptured) = 2019 then score        end) as score_2020
from mytable
where datecaptured >= '20190101' and datecaptured < '20210101'
group by month(datecaptured), day(datecaptured), clientid, systemcategoryid, dataqualitycategoryid

【讨论】:

【参考方案2】:

在我看来,这就像 left join

select t2019.*, t2020.datecaptured, t2020.score
from t t2019 left join
     t t2020
     on t2020.clientid = t2019.clientid and
        t2020.systemcategoryid = t2019.systemcategoryid and
        t2020.dataqualitycategoryid = t2019.dataqualitycategoryid and
        t2020.datecaptured = dateadd(year, 1, t2019.datecaptured)
where t2019.datecaptured >= '2019-01-01' and
      t2019.datecaptured < '2020-01-01'

【讨论】:

以上是关于按年份透视 SQL Server 结果的主要内容,如果未能解决你的问题,请参考以下文章

是否可以使用 SQL Server 使用相同的数据透视列进行多个数据透视

SQL 按年份分组给出不正确的结果

在 oracle SQL 中,有没有一种好方法可以按年份或其他一些不在 select 语句中的变量来分解聚合结果?

在多个条件上旋转多个列

SQL: 一般情况按年分组,特殊年份按指定日期分组,SELECT语句怎么写?

SQL Server 2012 中的年份计算