2016-12-14 66 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包含表/視圖的所有列名稱,並且可以使用各種條件搜索和過濾它們。

相關問題