【问题标题】:Is there a way to split sql results by year?有没有办法按年拆分 sql 结果?
【发布时间】:2020-04-27 09:15:29
【问题描述】:

我目前有以下SQL语句:

SELECT
    [Manager].[Name], 
    COUNT([Project].[ProjectId]) AS TotalProjects
FROM 
    ([Project]
INNER JOIN 
    [Manager] ON [Project].[ManagerId] = [Manager].[ManagerId])
WHERE 
    [Project].[CurrentStatusId] = 5
GROUP BY 
    [Manager].[Name]

它目前会列出每位经理的全部项目。我想让它按完成的年份将项目分开。因此,基本上计算每个经理每年(2016 年、2017 年等)的总项目数,以及所有时间的总项目数。我可以使用[Project].[CurrentStatusDt] 列作为日期。

【问题讨论】:

  • 你好,你的 sql 平台是什么?
  • @zip,Sql Server 2019
  • 请举例说明您正在使用的数据
  • @MkWTF 您需要查看哪些数据?
  • 输入数据的示例(将是 Project 和 Manager 表中的几行),其中仅包含您需要使用的列,据我所知是 [Manager]。[Name ]、[项目].[ProjectId]、[项目].[CurrentStatusDt]。也是您期望的输出示例。这些都不需要是真实的。

标签: sql sql-server group-by count pivot


【解决方案1】:

只需将项目年份添加到SELECTGROUP BY 子句:

SELECT
    [Manager].[Name], 
    YEAR([Project].[CurrentStatusDt]) PojectYear,
    COUNT([Project].[ProjectId]) AS TotalProjects
FROM [Project]
INNER JOIN [Manager] ON [Project].[ManagerId] = [Manager].[ManagerId]
WHERE [Project].[CurrentStatusId] = 5
GROUP BY [Manager].[Name], YEAR([Project].[CurrentStatusDt])

旁注:您不需要在 SQL Server 中的联接周围加上括号(这是 MS Access 限制)。


编辑

如果您想将年份分布在列而不是行上,那么一种解决方案是使用条件聚合

SELECT
    [Manager].[Name], 
    SUM(CASE 
        WHEN [Project].[CurrentStatusDt] < CAST('2019-01-01' AS DATE)
        THEN 1 
        ELSE 0 
    END) TotalProjects2018,
    SUM(CASE 
        WHEN [Project].[CurrentStatusDt] >= CAST('2019-01-01' AS DATE)
        THEN 1 
        ELSE 0 
    END) TotalProjects2019
FROM [Project]
INNER JOIN [Manager] ON [Project].[ManagerId] = [Manager].[ManagerId]
WHERE 
    [Project].[CurrentStatusId] = 5 
    AND [Project].[CurrentStatusDt] >= CAST('2018-01-01' AS DATE)
    AND [Project].[CurrentStatusDt] <  CAST('2020-01-01' AS DATE)
GROUP BY [Manager].[Name]

【讨论】:

  • 有没有办法在sql中将其拆分为不同的年份?就像所有 2018 年都在一个列中所有 2019 年都在另一列中一样?
猜你喜欢
  • 2019-11-09
  • 1970-01-01
  • 2020-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-12
相关资源
最近更新 更多