select 未指定字段名称的视图中所有字段的所有平均值
select all averages of all fields from a view without specifying field names
所以我在我的数据库中有相当广泛的视野。我有以下由几个 table 生成的虚拟视图。 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,所以任何适用于它们的解决方案都是 acceptable.
简而言之,我正在寻找一种方法来指定我想在不指定字段名称的情况下获取所有字段的所有平均值,就像 SELECT *
和 return 它们一样像上面的查询。违反语法的类似物是
SELECT * FROM view_name
和 SELECT AVG(*) FROM view_name
如果您想使用我创建的虚拟视图,可以使用虚拟 table 来模拟它(如前所述,实际视图比 table 宽得多):
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);
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
包含 table/view 的所有列名,并且可以使用各种条件搜索和过滤它们。
所以我在我的数据库中有相当广泛的视野。我有以下由几个 table 生成的虚拟视图。 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,所以任何适用于它们的解决方案都是 acceptable.
简而言之,我正在寻找一种方法来指定我想在不指定字段名称的情况下获取所有字段的所有平均值,就像 SELECT *
和 return 它们一样像上面的查询。违反语法的类似物是
SELECT * FROM view_name
和 SELECT AVG(*) FROM view_name
如果您想使用我创建的虚拟视图,可以使用虚拟 table 来模拟它(如前所述,实际视图比 table 宽得多):
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);
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
包含 table/view 的所有列名,并且可以使用各种条件搜索和过滤它们。