2013-09-25 30 views
1

我在mysql中有一個數據集,其中包含多個命名接口的帶寬測試結果,包括執行測試的日期和接口的名稱。樣本數據集都將是這個樣子:在mySQL中執行任意數量的自連接

| date | testResult | interface | 
--------------------------------------- 
| 12/25 |  32  | eth0  | 
| 12/25 |  21  | eth0  | 
| 12/25 |  25  | eth0  | 
| 12/26 |  30  | eth0  | 
| 12/27 |  33  | eth0  | 
| 12/25 |  12  | eth1  | 
| 12/25 |  16  | eth1  | 
| 12/27 |  3  | vz0  | 
| 12/26 |  120  | virt1 | 

我需要圖表在某一天每個接口的平均結果,所以我目前的解決方案是

SELECT `date`, AVG(`testResult`) as avg, `interface` FROM `tests` WHERE 1=1 
GROUP BY date, interface ORDER BY interface, date 

這讓我像

結果
| date |  avg  | interface | 
--------------------------------------- 
| 12/25 |  26  | eth0  | 
| 12/26 |  30  | eth0  | 
| 12/27 |  33  | eth0  | 
| 12/25 |  14  | eth1  | 
| 12/26 |  120  | virt1 | 
| 12/27 |  3  | vz0  | 

我的問題是,我需要這個數據「加入」(我認爲)的日期,當天每個接口的平均值列。結果集中接口的名稱和數量不是恆定的,並且不能被硬編碼。我理想中的結果集是這樣的:

| date | avg_eth0 | avg_eth1 | avg_virt1 | avg_vz0 | 
------------------------------------------------------------------- 
| 12/25 |  26  |  14  | NULL  | NULL | 
| 12/26 |  30  |  NULL | 120  | NULL | 
| 12/27 |  33  |  NULL | NULL  | 3  | 

有沒有執行這個連接的方式,基本上開創了interface列的每個唯一值的列?

+1

跨標籤的實際上不可能在MySQL中,您需要應用程序級代碼。請參閱[也是這個答案](http://stackoverflow.com/questions/8977855/mysql-dynamic-cross-tab) – Wrikken

+0

你可以生成查詢,然後執行它?有非常公式化的查詢可以做到這一點,但您需要先查詢哪些值在那裏,或者只需在Excel中使用數據透視表;) – gordatron

回答

0

我會建議使用旋轉:

select date, 
AVG(case when interface='eth0' then avg else 0)) as eth0, 
AVG(case when interface='eth0' then avg else 0)) as eth1, 
AVG(case when interface='virt1' then avg else 0)) as virt1, 
AVG(case when interface='vz0' then avg else 0)) as vz0 
from (
SELECT `date`, AVG(`testResult`) as avg, `interface` FROM `tests` WHERE 1=1 
GROUP BY date, interface ORDER BY interface, date) as z group by date 
0

你不能在不知道不同的值在樞軸列生成SQL的任何口味樞軸表查詢。

換句話說,您必須按照@David Jashi的回答中所示,對每個接口的一列進行硬編碼。

但這意味着在編寫SQL查詢之前,您需要首先了解接口的不同值。你可以通過運行一個查詢作爲第一步做到這一點倒也乾脆:

SELECT DISTINCT interface FROM `tests`; 

然後遍歷結果,追加更多的列SQL查詢做支點。

對不起,SQL無法查詢接口,並且在同一個查詢中動態添加更多列,因爲它在數據中遇到不同的值。你需要運行兩個查詢。