首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用GROUP BY对行中列的值进行求和

使用GROUP BY对行中列的值进行求和
EN

Stack Overflow用户
提问于 2018-09-10 15:53:33
回答 3查看 270关注 0票数 0

我有一张表,它有以下几个字段;

代码语言:javascript
复制
id (int)
line_id (int)
cell_no (int)
timestamp (datetime)
total (int)
passed (int)
data_type (varchar)
created_at (datetime)
updated_at (datetime)

对于表,有多个包含相同值的cell_no的行。我希望查询该表,合并具有相同cell_no值的所有行,将每个不同cell_no的传递总数和总数之和,然后以升序返回按传递/总计排序的结果。

我可以让它在MySQL中正常工作,但我不能让它在MSSQL中工作,因为它抱怨某些字段在定义上不在组中,但是当我将它们放入组中时,cell_no相同的行不会合并。

下面是如何在MySQL中进行查询;

代码语言:javascript
复制
SELECT id, cell_no, data_type, sum(total) AS total, sum(passed) AS passed
FROM line_data AS ld
WHERE line_id = 1
      AND timestamp >= '2018-07-29 00:00:00'
      AND timestamp <= '2018-07-29 23:00:00'
GROUP BY cell_no
ORDER BY ((passed / total) * 100) ASC

我将如何向MSSQL展示这一点?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-09-10 16:09:40

您的问题是查询无效SQL。每个cell_no存在多个iddata_type,并且您不告诉DBMS要选择哪一个。

MySQL静默地将select子句转换为

代码语言:javascript
复制
SELECT
  ANY_VALUE(id),
  cell_no,
  ANY_VALUE(data_type),
  SUM(total) AS total,
  SUM(passed) AS passed

函数ANY_VALUE(id)意味着您不关心要为结果选择哪一个单元格的ID。

ANY_VALUE在Server中不可用,但由于您显然不在乎哪个值,所以可以用MINMAX替换它

代码语言:javascript
复制
SELECT
  MIN(id),
  cell_no,
  MIN(data_type),
  SUM(total) AS total,
  SUM(passed) AS passed

更新:另一个问题可能是您的ORDER BY子句。7/2在MySQL中是3.5 (应该是预期的),但在Server中只有3,因为Server看到两个整数的除法,并且希望结果也是一个整数。您可以将一个或两个整数转换为十进制以获得小数结果:

代码语言:javascript
复制
ORDER BY (CAST(passed AS DECIMAL) / total) * 100 ASC
票数 2
EN

Stack Overflow用户

发布于 2018-09-10 16:04:01

你有两个错误:

  • 您只能选择按组聚合或指定的字段。
  • 你必须按订单将总数加起来。

你有三个选择来修正它们。

  1. 从select中删除id列 选择cell_no,SUM(总计)作为总计,SUM(传递)从line_data传递为ld,其中line_id =1,时间戳>= '2018-07-29 : 00:00:00‘和时间戳<= '2018-07-29 23:00:00’组按cell_no顺序(( SUM( passed ) / SUM(总计)* 100)
  2. id列添加到group by中: 选择id、cell_no、data_type、SUM(总计)作为总计,SUM( passed )从line_data传递为ld,其中line_id =1,时间戳>= '2018-07-29 00:00:00‘和时间戳<= '2018-07-29 23:00:00:00’组按id、cell_no、data_type ORDER (SUM(传递)/SUM(总计)* 100)
  3. 聚合id列(具有最大值、最小值或.) 选择MAX(id)、cell_no、data_type、SUM(总计)作为总计,SUM( passed )从line_data传递为ld,其中line_id =1,时间戳>= '2018-07-29 00:00:00‘和时间戳<= '2018-07-29 23:00:00’组按cell_no,data_type ORDER按(SUM(Passed)/SUM(总计)* 100)
票数 1
EN

Stack Overflow用户

发布于 2018-09-10 15:57:27

没有聚合的Select语句中的所有字段都需要在Group中。

SELECT id, cell_no, data_type, sum(total) AS total, sum(passed) AS passed, (sum(passed)/sum(total)*100) as percent_passed FROM line_data AS ld WHERE line_id = 1 AND timestamp >= '2018-07-29 00:00:00' AND timestamp <= '2018-07-29 23:00:00' GROUP BY id, cell_no, data_type ORDER BY 6 ASC

编辑以包括select语句中传递的百分比,然后按6顺序按第6列排序。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52261476

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档