2016-12-14 7 views
2

データベースでかなり広いビューを持っています。私はいくつかのテーブルから生成された次のダミービューを持っています。フィールド名を指定せずにビューからすべてのフィールドのすべての平均を選択する

avg(field1) avg(field2) avg(field3) avg(field4) avg(field5) 
----------- ----------- ----------- ----------- ----------- 
2.0   5.0   8.0   11.0   14.0 
:結果が得られ

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

:私はからの平均を望んそれぞれすべてのフィールドに名前を付ける必要があり、その平均値を取得するには

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

SELECT * FROM view_name;は以下のものを生み出します

実際のユースケースの中には、レポートのような目的のために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); 

答えて

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にはテーブル/ビューのすべての列名が含まれており、さまざまな基準を使用してそれらを検索およびフィルタリングできるということです。

関連する問題