MySQL选择每个列的平均值而不指定所有列

k2arahey  于 2023-03-22  发布在  Mysql
关注(0)|答案(1)|浏览(106)

我试图查找如何使用SQL计算每列的平均值。然而,我能找到的每个示例都显式指定了列,如下所示:

SELECT AVG(column1), AVG(column2), ...
FROM table;

或者它将指定如何跨列聚合结果以形成某种总均值,如下所示:

SELECT (AVG(column1)+AVG(column2)+...)/n_columns
FROM table;

我正在寻找的是一种方法来采取一个表,看起来像这样:
| 栏1|第2栏|第3栏|
| - ------|- ------|- ------|
| 1个|三个|五个|
| 第二章|四个|六个|
并得到如下所示的结果:
| 平均值(第1列)|平均值(第2列)|平均值(第3列)|
| - ------|- ------|- ------|
| 1.5 |三、五|五、五|
从这里开始,我希望能够添加各种分组和连接,所以如果需要使用某种“技巧”来实现这一点,它需要是一个非常可扩展的技巧。
我天真地希望我可以尝试一些像

SELECT AVG(*)
FROM table;

我可能有20%的希望,它可以这么简单,但唉,这不是有效的语法,正如前面提到的,试图寻找答案,我认为是一个相对简单的问题已经证明非常令人恼火。

6yt4nkrj

6yt4nkrj1#

你不能这样做,但有一个使用PREPARED STATEMENT的解决方案。
下面是一个例子:
1.为了便于理解,我使用了两个独立的变量:

SET @columns := NULL;
SET @sql := NULL;

1.首先使用information_schema.columns表生成列:

SELECT GROUP_CONCAT(CONCAT('AVG(',column_name,')')) INTO @columns
  FROM information_schema.columns
 WHERE table_schema='fiddle'
   AND table_name='Table1';

1.然后使用@columns变量中生成列创建查询:

SELECT CONCAT('SELECT ',@columns,' FROM Table1;') INTO @sql;

1.最后,准备,执行,然后释放语句:

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

您还可以使用如下所示的单一语法创建最终查询:

SET @sql := NULL;

SELECT CONCAT('SELECT ',
              GROUP_CONCAT(CONCAT('AVG(',column_name,')')),' 
     FROM ',table_schema,'.',table_name,';') INTO @sql
  FROM information_schema.columns
 WHERE table_schema='fiddle'
   AND table_name='Table1';

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

Demo fiddle

相关问题