2014-10-02 41 views
0

我有一份問卷答覆表。我希望能夠將我目前擁有的2個查詢合併到一個查詢中。我一直試圖做這個幾天,並且搜索了很多網站。Mysql子查詢平均7天和30天

這是我到目前爲止有:

select 
responses.gname, 
responses.client_id, 
responses.pri_cou_last, 
responses.olm_team, 
responses.work, 
responses.resDate, 
(SELECT round (avg(responses.response),2) FROM responses WHERE responses.formID='2'  AND responses.resDate<=curdate() AND responses.resDate>=DATE_SUB(NOW(), INTERVAL 30 DAY) AND responses.response>'0') 
AS avg30, 
    (SELECT round(avg(responses.response),2) FROM responses WHERE responses.formID='2' AND responses.resDate<=curdate() AND responses.resDate>=DATE_SUB(NOW(), INTERVAL 7 DAY) AND responses.response>'0') 
AS avg7 
from responses 
    GROUP BY responses.gname,responses.client_id 
    ORDER BY responses.pri_cou_last; 

兩個子查詢沒有做我想要什麼,很可能是因爲他們是錯的。他們給了我7天和30天的所有回覆的總平均值。

這裏是代碼,7天查詢,對於我的作品:

SELECT 
responses.gname, 
responses.olm_team, 
responses.work, 
round(avgresponses.response),2), 
responses.pri_cou_last, 
responses.client_id, 
visits.client_id, 
visits.bed, 
visits.depdate_ymd 
FROM 
responses 
LEFT JOIN 
visits ON responses.client_id=visits.client_id 
WHERE 
responses.formID='2' 
AND responses.resDate<=curdate() 
AND responses.resDate>=DATE_SUB(NOW(), INTERVAL 7 DAY) 
AND responses.response>'0' 
AND visits.bed>'0' 
AND visits.depdate_ymd='0000-00-00' 
GROUP BY 
responses.gname, 
responses.client_id 
ORDER BY 
responses.pri_cou_last 

預先感謝您!

感謝迄今的迴應。

是的,有一個formID列,它拼寫相同。

下面是代碼我現在有:

SELECT 
    r1.gname, 
    r1.client_id, 
    r1.pri_cou_last, 
    r1.olm_team, 
    r1.work, 
    r1.resDate, 
    round(AVG(CASE WHEN formID = '2' AND response > '0' AND resDate BETWEEN DATE_SUB(NOW(), INTERVAL 7 DAY) AND CURDATE() THEN response end),2) as a7, 
    round(AVG(CASE WHEN formID = '2' AND response > '0' AND resDate BETWEEN DATE_SUB(NOW(), INTERVAL 30 DAY) AND CURDATE() THEN response end),2) as a3, 
    visits.client_id, 
    visits.bed, 
    visits.depdate_ymd 
    FROM 
     responses as r1 
LEFT JOIN visits on r1.client_id=visits.client_id 
    WHERE visits.bed>'0' 
    GROUP BY r1.client_id,r1.pri_cou_last 
    ORDER BY r1.pri_cou_last; 

的問題是數據是不是我想要的。在某些行上有a3和a7返回NULL值。而且,沒有合適的行數。

通過客戶端查看上述查詢返回的數據後,我們發現該查詢中的數據是正確的。它提供了比原始查詢更多的數據,並且它們通過客戶端將數據輸入到程序中導致此查詢出現一些意外的響應。但他們是正確的...

我檢查了下面的1個答案,因爲使用CASE確實解決了問題。我永遠無法獲得相關查詢的工作。

再次感謝。

+1

刪除從那裏的應用情況,..THEN – Mihai 2014-10-02 19:30:21

回答

1

您需要使用相關子查詢:

SELECT 
    r1.gname, 
    r1.client_id, 
    r1.pri_cou_last, 
    r1.olm_team, 
    r1.work, 
    r1.resDate, 
    (SELECT round (avg(r2.response),2) 
     FROM responses AS r2 
     WHERE r2.formID='2'  
      AND r2.resDate<=curdate() 
      AND r2.resDate>=DATE_SUB(NOW(), INTERVAL 30 DAY) 
      AND r2.response>'0' 
      AND r2.gname = r1.gname AND r2.client_id = r1.client_id) 
    AS avg30, 
    (SELECT round(avg(r3.response),2) 
     FROM responses AS r3 
     WHERE r3.formID='2' 
      AND r3.resDate<=curdate() 
      AND r3.resDate>=DATE_SUB(NOW(), INTERVAL 7 DAY) 
      AND r3.response>'0' 
      AND r3.gname = r1.gname AND r3.client_id = r1.client_id) 
    AS avg7 
FROM responses AS r1 
GROUP BY r1.gname,r1.client_id 
ORDER BY r1.pri_cou_last; 

你也可以不用子查詢:

SELECT 
    r1.gname, 
    r1.client_id, 
    r1.pri_cou_last, 
    r1.olm_team, 
    r1.work, 
    r1.resDate, 
    ROUND(AVG(CASE WHEN formID = '2' 
        AND response > 0 
        AND resDate BETWEEN DATE_SUB(NOW(), INTERVAL 30 DAY) AND CURDATE() 
        THEN response 
       END) 2) AS avg30, 
    ROUND(AVG(CASE WHEN formID = '2' 
        AND response > 0 
        AND resDate BETWEEN DATE_SUB(NOW(), INTERVAL 7 DAY) AND CURDATE() 
        THEN response 
       END) 2) AS avg7 
FROM responses AS r1 
GROUP BY r1.gname,r1.client_id 
ORDER BY r1.pri_cou_last; 
+0

我用盡全力的日期條件從@Barmar上面,這裏它是我得到的錯誤。 (平均(當formID ='2'和響應> 0和resDate date_sub(now(),int'在行1它是mysql版本5.1.63 – Daemuon 2014-10-03 12:28:33

+0

當我嘗試第一個例子與相關的子查詢,因爲它是說我得到「未知列的response.formID在where子句」即使我將r1.formID添加到ourter select語句如果我將它添加到子查詢中我得到「操作數應該只包含一列」 – Daemuon 2014-10-03 12:45:58

+0

是否有一個「formID」列在'響應'表中? – Barmar 2014-10-03 16:06:16