【问题标题】:Calculating totals by group按组计算总计
【发布时间】:2014-01-15 16:39:25
【问题描述】:

我是 SQL 新手,并且只使用了大约 4 个月。但是我需要构建一个存储过程来计算类似项目的总数(使用数字标识符,即计算总数E.ThisNumber Where E.ThatNumber = 'Whatever'

这是我目前检索所需记录的代码:

SELECT *
FROM BarRevenueByProcedurePriceInfo
WHERE DeptID = '010.4730'
AND SegmentDateTime = '2013-11-30 00:00:00.000'
ORDER BY ProcedureID

这是输出:

                           ProcedureID/
RowUpdateTime   Dept Code  E.ThatNumber  E.ThisNumber  E.WhatIneed

2013-11-30      010.4730    4200028      108.15       108.15
2013-11-30      010.4730    4200028       18.18       126.33
2013-11-30      010.4730    4200028       63.63       189.81
2013-11-30      010.4730    4200069        5.00         5.00
2013-11-30      010.4730    4200069        5.01        10.01
2013-11-30      010.4730    4200069        6.00        16.01

请注意,当 E.ThatNumber 值与上一个条目不同时,计数如何重置。任何帮助将不胜感激。谢谢!

威廉·哈雷

【问题讨论】:

  • 什么是 RDBMS?并且您需要所有具有累积总和的注册表还是只需要总数?!
  • 我正在使用 SQL Server Management Studios
  • 什么版本的 SQL Server?
  • 那么注册表呢?只是总数还是你想要所有的累积?
  • Jorge - 仅按相应的 ProductIDnumber 进行总计。如果有不同的产品 ID,则应重置总数。 ProductID 为 E.ThisNumber; like E.ThisNumber 字段 WHERE E.ThatNumber 所需的总数相同。

标签: sql sql-server reporting


【解决方案1】:

不是 100% 确定您需要什么,可能是这样的:

SELECT *,
       SUM(ThisNumber) OVER (PARTITION BY ProcedureID)
FROM BarRevenueByProcedurePriceInfo
WHERE DeptID = '010.4730'
AND SegmentDateTime = '2013-11-30 00:00:00.000'
ORDER BY ProcedureID

【讨论】:

  • 感谢您的快速回复。不幸的是,我认为 SUM 运算符不能以这种方式使用。请查看错误消息:Msg 8117, Level 16, State 1, Line 2 Operand data type varchar is invalid for sum operator。
  • 我真的需要一个基于同一个表中特定列的类似字段条目的运行总计。因此,对于 instacne,如果有两个产品具有相同的产品编号,则将总数相加。但是,不要为具有不同产品编号的产品添加总计。
  • 1) 您需要将您的 varchar 列转换为数字来求和。例如SUM(CAST(ThisNumber as Numeric)) 2)我不知道你所说的产品编号是什么意思,你没有在你原来的问题中包括这个 - 这是你没​​有包括你想要总结的列吗?然后将PARTITION BY ProcedureID 更改为PARTITION BY whatevercolumnyouwant
  • @user3199071 - 查看问题 - 您的意思是 ProductID 吗?根据您的 cmets 似乎如此。
  • 为了清楚起见,我给出了一个与原始问题不同的例子。我最终使用了您发送的原始声明。非常感谢。非常感谢您的帮助!
【解决方案2】:

SQL Server 2012 支持累计和为:

SELECT *,
       sum(thisnumber) over (partition by procedureId order by (select NULL)) as whatIneed
FROM BarRevenueByProcedurePriceInfo
WHERE DeptID = '010.4730' AND
      SegmentDateTime = '2013-11-30 00:00:00.000'
ORDER BY ProcedureID;

在早期版本中,您需要使用关联子查询或加入聚合。

顺便说一句,行没有明显的顺序。如果你在做一个累积和,你真的应该有一个指定顺序的列。

【讨论】:

  • 感谢戈登。我正在使用 SSMS 08。不确定如何进行子查询或聚合。还是初学者。谢谢
猜你喜欢
  • 1970-01-01
  • 2019-04-11
  • 1970-01-01
  • 2010-09-17
  • 2019-10-27
  • 2022-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多