我不是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)
感谢您的帮助
答案 0 :(得分:1)
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);
这并不适用于所有情况,但在许多情况下,它提供了解决此类问题的简单方法。