【问题标题】:Is it possible to create calculation rows from query results in MySQL?是否可以从 MySQL 中的查询结果创建计算行?
【发布时间】:2015-08-02 00:06:44
【问题描述】:

我正在尝试找到一种方法来输出 SQL 搜索查询的一个(或两个)计算行,因此我可能会在原始结果列表的上方或下方看到原始结果以及与之关联的计算。例如,我有以下数据:

mysql> select * from data [where condition];
+----+--------+-----+--------+
| id | height | age | weight |
+----+--------+-----+--------+
|  1 |   65.2 |  45 |  45.23 |
|  2 |   63.1 |  47 |      0 |
|  3 |   59.2 |  37 |   38.1 |
|  4 |   59.8 |  39 |   36.4 |
|  5 |   63.4 |  37 |   38.1 |
|  6 |   72.1 |  34 |      2 |
|  7 |    100 |  50 |     20 |
+----+--------+-----+--------+

我想要的是能够执行任何查询来获取所有或部分数据,但让结果表给出如下内容(摘要/计算输出与原始数据分开,例如在它上面或下面):

mysql> query???
+--------+--------+------+--------+
|   id   | height |  age | weight |
+--------+--------+------+--------+
|      1 |   65.2 |   45 |  45.23 |
|      2 |   63.1 |   47 |      0 |
|      3 |   59.2 |   37 |   38.1 |
|      4 |   59.8 |   39 |   36.4 |
|      5 |   63.4 |   37 |   38.1 |
|      6 |   72.1 |   34 |      2 |
|      7 |    100 |   50 |     20 |
+--------+--------+------+--------+
| STDDEV |  13.26 | 5.57 |  17.15 |
|  COUNT |      7 |    7 |      7 |
|   etc. |   etc. | etc. |   etc. |
+--------+--------+------+--------+

我发现了一些方法,例如这个 (http://www.sqlservercurry.com/2011/06/sql-server-row-summary-column-summary.html),在某种程度上可以做到这一点,但是因为计算作用于所有行,所以它不适用于某些计算(例如,使用 stddev 结果为“0”对于除计算行之外的所有内容)。

我可以创建一个单独的计算结果,如下所示,但最好将它们以某种方式组合起来,如上所示。另外,下面只输出一行计算,如果有几行相关的计算就好了。

select stddev(height), stddev(age), stddev(weight) from data [where condition];

这里的重点是执行任何搜索查询并从结果中自动生成基本描述性信息的预览(偏差、计数、平均值等)。希望这可以直接在 SQL 中完成,而无需使用其他语言/API。

【问题讨论】:

  • 您可以做的是将列 stddev_age、stddev_weight 等添加到您的查询中,每行都是相同的,所以如果您查看结果中的任何行,如果您想要。可能很难看,但与数据类型没有冲突,而且很容易做到。

标签: mysql sql


【解决方案1】:

将您的结果与union 结合起来。如果您需要特定顺序的结果,则创建一个包含该列的优先级和顺序的列。

select id, height, age, weight, 0 sortorder 
from data [where condition]
union all
select 'stdev count', stddev(height), stddev(age), stddev(weight), 1
from data [where condition]
order by sortorder

【讨论】:

  • 请注意,这仅在联合中的两个查询必须具有相同数量的列并且列应该共享数据类型时才有效。如果它们不匹配,MySQL 可能会进行一些静默数据转换,但随后它可能会决定将stddev(age) 截断为整数,或者当 id 列突然变成字符串而不是 int 时,您的应用程序可能会感到困惑。老实说,它似乎比第二个查询更不可用。
  • @BaconBits 同意。如果可能,那么 2 个查询可能是更好的方法。
  • 啊,好吧...联合操作可以格式化表格,尽管它有点麻烦,因为它需要您为每个被联合的查询应用所需的条件。有没有办法只指定一次查询及其条件,然后根据初始查询返回的数据进行计算?
  • @Topher 您可以创建一个包含您的 where 条件的视图,但它仍然是单独的进程。我认为您正在寻找类似 @​​987654324@ 的东西,但要寻找其他功能。不幸的是,这不存在。
  • @FuzzyTree,单独的视图似乎很有帮助,但似乎需要在创建时设置条件,以后无法更新。这使得视图有些静态。我希望能够设置查询条件,然后动态更新摘要视图。例如,如果我将查询限制为前 3 个结果,那么我希望视图显示计数为 3,以及仅针对这三个结果的 STDDEV 和其他计算。照原样,如果视图是使用条件“限制 7”创建的,那么它将始终显示来自 7 个结果的计算,并且不会更新以对查询进行操作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-24
  • 2012-10-28
  • 2011-01-28
  • 1970-01-01
  • 2020-10-29
  • 1970-01-01
相关资源
最近更新 更多