SQL查询:在查询结果中添加缺少的天数

时间:2016-10-30 09:35:04

标签: sql oracle

我不是sql-pro。

我已经提出了这个问题:

SELECT CAST(SUBSTR(FEHLER.LosID,5,2) as INT), Sum(FEHLER.FehlerSumme)
FROM BLA.FEHLER FEHLER
WHERE (FEHLER.MAE=7) AND (FEHLER.LosID>16100100)
GROUP BY CAST(SUBSTR(FEHLER.LosID,5,2) as INT)
ORDER BY CAST(SUBSTR(FEHLER.LosID,5,2) as INT)

结果是例如:

(Column 1 = Day | Column 2 = Sum defective parts)
2 | 18
3 | 7
9 | 5

但我需要这样的事情:

1 | (0 oder NULL)
2 | 18
3 | 7
4 |
5 |
6 |
7 |
8 |
9 | 5
...
31 | 

所以我想加入查询,但我没有成功。

SELECT LEVEL FROM DUAL CONNECT BY LEVEL <=31

用这个子查询解决问题或者你有更好的想法是一个好主意吗? (在Excel中查询,Oracle-SQL-Server)

感谢您的帮助

2 个答案:

答案 0 :(得分:1)

的Oracle

select      
    r.n, t."Sum defective parts"
from                   
   (SELECT LEVEL as n 
    FROM DUAL 
    CONNECT BY LEVEL <= 31) r
left join  
    (SELECT 
         CAST(SUBSTR(FEHLER.LosID, 5, 2) as INT) as "Day", 
         Sum(FEHLER.FehlerSumme) as "Sum defective parts"
     FROM 
         BLA.FEHLER FEHLER
     WHERE 
         (FEHLER.MAE = 7) AND (FEHLER.LosID > 16100100)
     GROUP BY 
         CAST(SUBSTR(FEHLER.LosID, 5, 2) as INT)) t ON t."Day" = r.n
 ORDER BY   
     r.n;

答案 1 :(得分:0)

如果每天都有表中的数据,但WHERE子句在某天过滤掉了,那么您可以使用条件聚合来解决这个问题:

SELECT CAST(SUBSTR(f.LosID, 5, 2) as INT),
       Sum(case when f.MAE = 7 AND f.LosID > 16100100
                then FEHLER.FehlerSumme
           end)
FROM BLA.FEHLER f
GROUP BY CAST(SUBSTR(f.LosID, 5, 2) as INT)
ORDER BY CAST(SUBSTR(FEHLER.LosID, 5, 2) as INT);

这并不适用于所有情况,但在许多情况下,它提供了解决此类问题的简单方法。