【问题标题】:SUM on different columns based on other columns values根据其他列值对不同列求和
【发布时间】:2021-11-05 17:00:45
【问题描述】:

我敢打赌,标题并没有清楚地说明我作为一个完整的新手想要达到的目标,但会尝试在下面解释我的问题,并希望有人能抽出时间分享他们的智慧:) 假设我们有一个名为 TYPES (Microsoft SQL Server) 的表定期更新,即每半小时更新一次。它由独特的类型组成,对于每种类型,每个更新窗口都有提供的交易数量(如果有的话)(实际上它有数百万行、数百种类型和数十列保存了几年) 但为了简单起见:

DateTime Type Offered
2021-11-04 09:00 Type1 300
2021-11-04 09:00 Type2 30
2021-11-04 09:00 Type3 255
2021-11-04 09:30 Type 1 244
2021-11-04 09:30 Type 2 118
2021-11-04 09:30 Type 3 90

如果可能的话,我正在尝试对给定日期(24 小时内)为选定类型(比如说 type1 和 type3)分别提供的总和,即:

DateTime Type1_sum Type3_sum
2021-11-04 5621 4521
2021-11-05 5234 3651

非常感谢!

【问题讨论】:

  • 那么您如何获得所需的值,尤其是因为您的示例数据只有 2021-11-04 的日期?请注意,不建议将列命名为与保留字相同的名称,因为它要求它们是 [delimted] 并且不会传达任何含义。
  • SELECT SUM(offered) FROM Types GROUP BY trunc(date), type 将是一个起点。但这对于每种类型都会有一行

标签: sql tsql


【解决方案1】:

您可以通过对列 [DateTime] 的日期部分进行分组然后使用条件聚合来实现此目的:

select
    cast([DateTime] as date) as [DateTime],
    sum(case [Type] when 'Type1' then [Offered] end) as Type1_sum,
    sum(case [Type] when 'Type3' then [Offered] end) as Type3_sum
from YourTable
group by cast([DateTime] as date)

【讨论】:

  • 嗨,Michael,简单优雅,完美运行!非常感谢!如果可以的话,还有一个小问题,Type 列实际上只保存实际类型的数字 ID,并且是引用其他表的外键,我们将其称为 All_Types,其中保留了其名称的字符串值。现在我想在这里加入这个表并按类型名称而不是它的 ID 进行搜索。这可以做到吗?现在我必须使用: sum(case [Type] when '18754' then [Offered] end) as Type1_sum,而不是 sum(case [Type] when 'Type1' then [Offered] end) as Type1_sum,
猜你喜欢
  • 2014-05-07
  • 2019-11-16
  • 2020-09-17
  • 1970-01-01
  • 2021-01-09
  • 1970-01-01
  • 2020-05-30
  • 1970-01-01
  • 2019-03-08
相关资源
最近更新 更多