2016-12-14 68 views
2

所以我在我的数据库中有相当广泛的视图。我有几个表生成的以下虚拟视图。 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个字段,并且会使写入查询成为m如果我不需要指定每个列的平均值,那么更容易,我想知道是否有任何解决方法? 我使用的数据库是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); 

回答

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包含表/视图的所有列名称,并且可以使用各种条件搜索和过滤它们。

相关问题