【问题标题】:Perform action on selected columns depending on their name根据名称对选定的列执行操作
【发布时间】:2015-04-06 10:37:06
【问题描述】:

我有一个巨大的表格,包含三个“选择”列和许多“数据”列。

  ID   Thing1   Thing2   Thing3   avgData1   avgData2   highestEtc  
 ---- -------- -------- -------- ---------- ---------- ------------ 
   1        1        2        2        321        654          999  
   2        2        1        1        123        456           11  
   3        2        1        1        987        789           77  
   4        2        1        1        765        567           11  

在我的查询中,我现在选择“Thing1”=x、“Thing2”=y、“Thing3”=z 的所有条目(这三列是选择标准。)

获取这些行的目的是对以下每个数据列执行操作:如果它以“avg”开头,我想计算所有选定条目上特定列的平均值。在另一个前缀上,我想计算哪个数字出现最多。

有没有办法让 MySQL 数据库为我完成所有这些工作?我需要一个自动计算列的平均值并执行其他操作的 SQL 语句。

例如,假设我要选择条件 Thing1=2、Thing2=1 和 Thing3=1。有没有一种方法可以编写语句,使其只返回一个条目,以及计算出来的东西?

      Result                              
 ----------------- ----------------- ---- 
  (123+987+765)/3   (456+789+567)/3   11  

我听说这应该是可能的,并且不让数​​据库直接执行这些操作是一种不好的方法。不幸的是,我不知道该怎么做。

【问题讨论】:

  • 听起来您正在使用 hacky 方法将应用程序逻辑存储在数据库中?
  • @Ejay 到目前为止,我只是在我的数据库中存储“正常”数据。但我希望 SQL 对我查询的条目执行一些操作,这样我就不必在我的代码中操作结果(我听说获取一些东西然后操作它是不好的)
  • 在存储和更新 result 字段之前如何操作它以防任何计算字段更新?

标签: mysql sql average criteria


【解决方案1】:

试试这个:-

SELECT ID, AVG(avgData1) AS RESULT1, AVG(avgData2) AS RESULT2, highestEtc
FROM YOUR_TAB
WHERE Thing1 = 2
AND Thing2 = 1 
AND Thing3 = 1
GROUP BY ID
HAVING COUNT(highestEtc) > 1;

希望对你有所帮助。

【讨论】:

  • 谢谢,似乎有效!另一个问题是:是否有可能“动态地”做到这一点?这样我就不必对查询进行硬编码,而是在具有 avg 前缀和 min 前缀的列上执行 AVG() 等?那真是太棒了。
  • 哦,实际上“MIN”是错误的;我想获得频率最高的值 - 所以在这种情况下它是“11”并且与 MIN 的结果相同,但在其他情况下它可能是别的东西。例如,如果我有 77、11、77 这三个值,它应该返回 77。
  • 搞定了!只需将“GROUP BY ID”更改为“GROUP BY最高等”。非常感谢你的帮助!不过还有一个问题:如果我想在 group by 之前添加一个显示行数的列,我该怎么做?我添加了一个“COUNT(ID) AS rCount”,但对于上面的示例,它只显示 2,而它应该显示 3。你有什么想法吗?
  • 哦,还有另一个问题:“highestEtc”列显示正确的值,但平均值错误,因为它不计算不满足“Having”语句的行
猜你喜欢
  • 2017-03-08
  • 1970-01-01
  • 2018-05-30
  • 2013-11-21
  • 2021-06-07
  • 2021-10-04
  • 1970-01-01
  • 1970-01-01
  • 2021-06-08
相关资源
最近更新 更多