2017-07-24 70 views
0

我有一个表中有大量小时花费的条目。我试图根据日期的某些特征花费数小时。我的查询将与此任务竞争,但如果某个日期的特定特征集没有值,则该日期将不会返回任何数据。如果我使用不同的连接类型加入表,我知道如何解决这个问题,但当连接处于where语句时,我不知道该怎么做。加入子查询和丢失数据

SELECT 
t1.dates, 
t1.hours1, 
t2.hours2, 
t3.hours3, 
t4.hours4 

FROM 
    (
     SELECT 
     dates, 
     SUM(times) AS hours1 
     FROM mytable 
     WHERE 
     characterisics1 
     GROUP By dates 
    ) t1, 
    (
     SELECT 
     dates, 
     SUM(times) AS hours2 
     FROM mytable 
     WHERE 
     characterisics2 
     GROUP By dates 
    ) t2, 
    (
     SELECT 
     dates, 
     SUM(times) AS hours3 
     FROM mytable 
     WHERE 
     characterisics3 
     GROUP By dates 
    ) t3, 
    (
     SELECT 
     dates, 
     SUM(times) AS hours4 
     FROM mytable 
     WHERE 
     characterisics4 
     GROUP By dates 
    ) t4 

WHERE 
t1.dates = t2.dates and t1.dates = t3.dates and t1.dates = t4.dates 

ORDER BY 
t1.dates DESC 
+0

请不要使用隐式联接。他们是一种很差的编程技术。 – HLGEM

回答

3

使用条件聚合。 。 。如此简单:

SELECT dates, 
     SUM(CASE WHEN characterisics1 THEN times ELSE 0 END) AS hours1, 
     SUM(CASE WHEN characterisics2 THEN times ELSE 0 END) AS hours2, 
     SUM(CASE WHEN characterisics3 THEN times ELSE 0 END) AS hours3, 
     SUM(CASE WHEN characterisics4 THEN times ELSE 0 END) AS hours4, 
     SUM(CASE WHEN characterisics5 THEN times ELSE 0 END) AS hours5 
FROM mytable 
GROUP By dates;