2011-06-11 117 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