2011-06-11 106 views
0

我有一個關於這個查詢複製COUNT如何糾正INNER JOIN中的「重複」計數?

SELECT 
DATE(dia.DTM) AS 'Dia', 
COUNT(temp.TMP) AS 'Index' 
FROM dados_meteo dia 
INNER JOIN dados_meteo temp 
ON temp.DTM = dia.DTM 
AND temp.TMP BETWEEN 20 AND 30 
WHERE dia.POM = 'Alcobaca' 
GROUP BY DATE(dia.DTM) 
+0

你爲什麼加入dados_meteo到自己? – Olaf 2011-06-11 16:53:57

+0

我必須保證,即使當天只有溫度波動20,我有一個計數= 0 – Hugo 2011-06-11 16:59:25

回答

2

如果我理解正確的(請描述exacly你想要查詢),您可以通過將INNER JOIN更改爲LEFT JOIN來獲得所需內容。

或本:

SELECT 
    DATE(dia.DTM) AS 'Dia', 
    SUM(dia.TMP BETWEEN 20 AND 30) AS 'Index' 
FROM dados_meteo dia 
WHERE dia.POM = 'Alcobaca' 
GROUP BY DATE(dia.DTM) 

什麼上面的查詢實際上做的是這樣的:

SELECT 
    DATE(dia.DTM) AS 'Dia', 
    COUNT(CASE WHEN dia.TMP BETWEEN 20 AND 30 
       THEN 'yes' 
       ELSE NULL 
      END) 
     AS 'Index' 
FROM dados_meteo dia 
WHERE dia.POM = 'Alcobaca' 
GROUP BY DATE(dia.DTM) 

的意見後,這裏有一個輕微的修改:

SELECT 
    DATE(dia.DTM) AS 'Dia', 
    CASE WHEN SUM(dia.TMP BETWEEN 20 AND 30) >= 24 
     THEN 20 
     ELSE -10 
    END AS 'Index' 
FROM dados_meteo dia 
WHERE dia.POM = 'Alcobaca' 
GROUP BY DATE(dia.DTM) 
+0

謝謝。我有一張每天有96張臨時記錄的桌子(15分鐘時間)。當溫度在20到30之間的時間超過6小時時,我希望查詢爲我提供了一個有20天的專欄和一個20的專欄。否則我需要一天和-10。 – Hugo 2011-06-12 10:07:17

+0

@Hugo:只是顯示'20'或'-10'的列? – 2011-06-12 10:16:26

+0

再次問候。這就是它 – Hugo 2011-06-12 10:24:45

0

我更新了查詢,但我真的建議有一個單獨的日曆表:


select "Dia", "Index" 
from 
    (select distinct date(dia.dtm) calendar_date 
    from dados_meteo) calendar left outer join 
    (select date(dtm) as "Dia", count(tmp) as "Index" 
    from dados_meteo 
    where pom = 'Alcobaca' and tmp between 20 and 30 
    group by date(dtm)) temp on calendar.calendar_date = "Dia" 

+0

謝謝。當我們只有溫度波動時,它不會給我0 0 – Hugo 2011-06-11 17:00:51

+0

確切的輸出是什麼?您是否在「索引」列中獲取了位置列表和空值列表?在這種情況下嘗試使用ifnull()或coalesce()。 – Olaf 2011-06-11 17:05:23

+0

不,我不知道。那就是問題所在。當一天只有20下的記錄時,它缺失。如果您在給我的解決方案中使用null()或coalesce(),我該如何使用? – Hugo 2011-06-11 17:08:32