【问题标题】:Create a view with totals from multiple columns创建一个包含多列总计的视图
【发布时间】:2016-05-12 22:40:09
【问题描述】:

我需要创建一个显示各种总计的视图。

我有两张桌子。一个带有用户 ID 和工作申请的状态代码。另一个具有 UserID 和 4 个包含布尔 0/1 的列。这些列中的每一个都表示一项工作技能(如跑步、跳跃、投掷、攀爬)。该视图只需要显示每个工作技能的总数,一次用于正在进行的应用程序,一次用于已完成的应用程序。我无法确定每个技能的分组依据和选择列。

User 表有 ID(int) 和 ApplicationStatus(varchar4)。
应用状态为:

  • 0000 如果尚未启动
  • 0500 正在进行时
  • 完成时为 1000。

JobSkills 表有: ID、用户表的匹配 UserID 和 4 个 JobSkill 列:JobSkill_1、JobSkill_2、JobSkill_3 和 JobSkill_4,每个都定义为整数,如果用户具有该技能,则包含 1。
该视图应该显示以下内容的摘要:

  • 有多少用户的状态为 0000
  • 有多少状态为 0500
  • 有多少状态为 1000
  • 有多少状态为 1000 且 JobSkill_1 =1
  • 有多少状态为 1000 且 JobSkill_2 =1
  • 有多少人的状态为 1000 并且 JobSkill_3 =1
  • 以及有多少状态为 1000 且 JobSkill_4 =1

类似:

SELECT 
    [UserID],
    SUM(JobSKill_1) as Run,
    SUM(JobSkill_2) AS Jump,
    SUM(JobSkill_3) AS Throw, 
    SUM(JobSkill_4) AS Climb
FROM [dbo].[tblJobSkills]
GROUP BY [UserID] WITH ROLLUP

【问题讨论】:

  • 如果您发布您编写的代码,我们可以帮助您找出其中的任何问题!
  • 请发布您的表格定义、表格中存储的示例数据以及您想要获取的数据的示例。
  • 我们能否得到一个明确的“条件聚合”答案来将所有这些标记为重复项?
  • @Kyle Hale 如果我能理解确切的要求,我会尝试给出明确的答案,但问题似乎自相矛盾(参见上面给出的示例和要求描述)
  • @Alex 你的答案是正确的,如果约翰知道如何编写他不会在 SO 上发布的查询。

标签: sql-server view group-by


【解决方案1】:

看来您需要条件聚合来获得所需的结果。

在 SQL Server 中,聚合函数可以将表达式作为参数(例如 SUM)。

因此可以在聚合函数中包含 CASE WHEN 表达式
SUM( CASE WHEN a = b THEN c ELSE d END )
其中 a、b、c、d 可以是列、常量、函数或表达式(请参阅CASE

以上将导致为每一行计算 CASE 表达式,并将结果作为输入传递给 SUM 函数。

注意:以上与 CASE WHEN SUM() = a THEN b ELSE c END 不同,因为在这种情况下,SUM 函数首先处理所有输入行,并且仅比较 SUM 函数的结果。

使用上述方法,可以在与 GROUP BY 中指定的条件不同的一组条件下进行聚合。

您的问题的解决方案(假设 User 和 JobSkills 之间是一对一的关系)如下:

SELECT SUM( CASE ApplicationStatus WHEN '0000' THEN 1 ELSE 0 END ) AS NotStartedCnt,
    SUM( CASE ApplicationStatus WHEN '0500' THEN 1 ELSE 0 END ) AS InProgressCnt,
    SUM( CASE ApplicationStatus WHEN '1000' THEN 1 ELSE 0 END ) AS CompletedCnt,
    SUM( CASE ApplicationStatus WHEN '1000' THEN JobSkill_1 ELSE 0 END ) AS JobSkill_1Count,
    SUM( CASE ApplicationStatus WHEN '1000' THEN JobSkill_2 ELSE 0 END ) AS JobSkill_2Count,
    SUM( CASE ApplicationStatus WHEN '1000' THEN JobSkill_3 ELSE 0 END ) AS JobSkill_3Count,
    SUM( CASE ApplicationStatus WHEN '1000' THEN JobSkill_4 ELSE 0 END ) AS JobSkill_4Count
FROM User AS U
    INNER JOIN JobSkills AS JS ON U.ID = JS.UserID

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-08-13
    • 2021-10-07
    • 1970-01-01
    • 2015-03-28
    • 2021-01-22
    • 2022-10-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多