2012-03-15 42 views
1

我試圖計算日期範圍的平均值之間的百分比變化的平均值百分比變化,網站的100名旅客中有日期範圍A和200個訪問者在日期範圍B內,增加了100%。MySQL的:相對於日期範圍B.</p> <p>例如,當計算從兩個範圍

這些值存儲在一個表中。

編輯:訪問值存儲在一個表中,URL存儲在第二個表中,其中包含URL和一個用於連接兩個表的ID。

,因爲它代表我的查詢是:

SELECT urls.url, DATE_FORMAT(test.timestamp, '%Y %m %d') AS timestamp, 
(SELECT test.visits 
FROM test, urls 
WHERE test.url_id = urls.id 
AND urls.url LIKE '%website%' 
AND test.location LIKE '%gb%' 
AND test.timestamp >='$startdate' 
AND test.timestamp <= '$enddate' 
) AS visitors1, 

(SELECT test.visits 
FROM test, urls 
WHERE test.url_id = urls.id 
AND urls.url LIKE '%website%' 
AND test.location LIKE '%gb%' 
AND test.timestamp >= DATE_SUB('$startdate', INTERVAL 
    DATEDIFF('$enddate','$startdate') DAY) 
AND test.timestamp <= DATE_SUB('$enddate', INTERVAL 
    DATEDIFF('$enddate','$startdate') DAY) 
) AS visitors2 
FROM test, urls 
WHERE test.url_id = urls.id 
AND urls.url LIKE '%website%' 
AND test.location LIKE '%gb%' 

編輯:在例如查詢更正錯誤

我明白,我需要添加類似:

(visitors1 - visitors2)/visitors2 *100 

我只是不知道在哪裏

編輯:我正在建設一個儀表板,所需的輸出是

URL |訪問範圍1 |訪問範圍2 |百分比變化

example.com | 100 | 200 | 100%

對原始發佈中的錯誤表示歉意。

+0

你可以在mysql中這樣做,但查詢將是相當不可讀的。你可以直接寫查詢(像你一樣)來返回期間A和B的訪問次數,然後從mysql返回後對結果執行(A-B)/ B * 100? – Agrajag 2012-03-15 13:55:08

回答

0

只需將整個選擇內容包裝在另一個select之內,您可以使用它們的別名訪問結果列。

/*Outer select*/ 
SELECT 
    q.url, q.`timestamp`, q.visitors1, q.visitors2 
    , (q.visitors1 - q.visitors2)/(q.visitors2+0.00001) *100 AS percentage 
FROM (
/*Inner select*/ 
SELECT 
    url 
    , DATE_FORMAT(`timestamp`, '%Y %m %d') AS `timestamp`  
    , (SELECT visits 
    FROM test t 
/*note the use of explicit inner joins*/ 
    INNER JOIN urls u ON (t.url_id = u.id) 
     WHERE url LIKE '%website%' AND location LIKE '%gb%' 
/*instead of >= and <= you can use `between` it's shorter to type.*/ 
     AND timestamp BETWEEN '$startdate' AND '$enddate') AS visitors1 
    , (SELECT visits 
    FROM pagetest p 
    INNER JOIN urls u ON (p.url_id = u.id) 
     WHERE u.url LIKE '%icis%com%' 
     AND p.f_TTFB < p.f_render 
     AND location LIKE '%gb%' 
     AND `timestamp` BETWEEN 
      DATE_SUB('$startdate', INTERVAL DATEDIFF('$enddate','$startdate') DAY) 
     AND DATE_SUB('$enddate', INTERVAL DATEDIFF('$enddate','$startdate') DAY)) 
    AS visitors2 
FROM test 
/* looks like you've got a missing join in the above FROM clause */ 
WHERE url_id = id AND url LIKE '%website%' AND location LIKE '%gb%' 
/*Note that you need to supply each inner select with an alias*/ 
) AS q 
/*I've used "q" here*/ 

請注意,請不要使用隱式SQL'89連接語法,而應使用顯式SQL'92連接。 它們更容易調試,因爲連接條件和過濾條件不會混合在一起。

+0

謝謝約翰 - 我只是想用你的榜樣來工作。我認爲我通過在我給出的例子中犯了一個錯誤而幫助自己(新手錯誤!) – tomsutton1984 2012-03-16 10:32:13