从视图中选择所有字段的所有平均值,而不指定字段名称

时间:2016-12-14 12:36:56

标签: sql database sqlite mariadb

所以我的数据库中有相当广泛的视图。我有以下从几个表生成的虚拟视图。 SELECT * FROM view_name;产生以下内容:

field1      field2      field3      field4      field5
----------  ----------  ----------  ----------  ----------
1           4           7           10          15
2           5           8           11          14
3           6           9           12          13

要获得他们的平均值,我必须为每个我想要平均值的字段命名:

SELECT avg(field1), avg(field2), avg(field3), avg(field4), avg(field5) FROM view_name;

产生结果:

avg(field1)  avg(field2)  avg(field3)  avg(field4)  avg(field5)
-----------  -----------  -----------  -----------  -----------
2.0          5.0          8.0          11.0         14.0

由于类似报表的目的,某些实际用例的视图范围为20-25个字段,如果我不必指定每个列,我会更容易编写查询喜欢从中得到平均值,我想知道这周围是否有任何变通方法? 我正在使用的数据库是sqlite和mariadb,因此任何适合其中任何一个的解决方案都是可以接受的。

简而言之,我正在寻找一种方法来指定我想要获取所有字段的所有平均值而不指定字段名称,就像SELECT *一样工作并返回它们就像上面的查询一样。违反语法的模拟将是

SELECT * FROM view_nameSELECT AVG(*) FROM view_name

如果您想使用我创建的虚拟视图,您可以使用虚拟表来模拟它(如上所述,实际视图比此表宽得多):

CREATE table dummy (
field1 int,
field2 int,
field3 int,
field4 int,
field5 int
);

INSERT INTO dummy VALUES (1,4,7,10,15);
INSERT INTO dummy VALUES (2,5,8,11,14);
INSERT INTO dummy VALUES (3,6,9,12,13);

1 个答案:

答案 0 :(得分:2)

SELECT CONCAT('SELECT ', GROUP_CONCAT(CONCAT('AVG(',column_name,')')),' FROM view_name') 
FROM information_schema.columns WHERE table_name = 'view_name' INTO @query;
PREPARE stmt FROM @query;
EXECUTE stmt;

+-------------+-------------+-------------+-------------+-------------+
| AVG(field1) | AVG(field2) | AVG(field3) | AVG(field4) | AVG(field5) |
+-------------+-------------+-------------+-------------+-------------+
|      2.0000 |      5.0000 |      8.0000 |     11.0000 |     14.0000 |
+-------------+-------------+-------------+-------------+-------------+

此外,它可以包装到存储的例程中以使视图名称成为参数。我们的想法是INFORMATION_SCHEMA.COLUMNS包含表/视图的所有列名,可以使用各种标准对它们进行搜索和过滤。