Проблема здесь заключается в использовании той же самой переменной date
в цикле. Вам нужно заново инициализировать его.
Как можно видеть в разделе Значение параметра в ссылке здесь . Нулевые и отрицательные значения в setDate()
устанавливают дату предыдущего месяца.
Следовательно, в setDate(0)
значение даты установлено на последний день февраля. Теперь, когда вы используете ту же переменную, setDate(-1)
берет предыдущий месяц с февраля, следовательно, вы получаете январь.
Вам нужно изменить код на что-то вроде этого:
generate() {
this.date_new = [];
var date1 = new Date();
for (var i = 0; i < 7; i++) {
// re-initialize date
var date = new Date();
date.setDate(date1.getDate() - i);
var a = date.toString();
var str = this.convert(a);
this.date_new.push(str);
}
}
Надеюсь, это поможет:)
использовать левое внешнее объединение:
SELECT b.Book_Title, COUNT(s.Book_ID)
FROM Book b left outer join Sold s on b.Book_ID = s.Book_ID
GROUP BY b.Book_Title;
Вы также можете использовать коррелированный подзапрос в предложении select
:
select b.book_title, (select count(*) from sold s where s.book_id=b.book_id) from book b
Ему не нужна ни группа по
, ни external join
s, который может быть медленным для очень большого числа строк.
Как сказал @Vincent, вам нужно внешнее соединение. В последнее время я мало работал с Oracle, но его собственный синтаксис внешнего соединения довольно причудлив. (Я не знаю, догнали ли они ANSI по этому поводу.)
Собственный синтаксис:
SELECT b.Book_Title,
COUNT(s.Book_ID)
FROM Book b,
Sold s
WHERE b.Book_ID = s.Book_ID (+)
GROUP BY b.Book_Title;
Вы должны получить количество в подзапросе и оставить внешнее соединение с ним следующим образом:
select b.book_title,
case when s.book_id is null then 0
else s.salesCount end as Sales
from book b
left outer join
(select count(*) as salesCount, book_id from sales group by book_id) s on b.book_id = s.book_id
сделать другое объединение из книги в проданную. Вы можете все еще получить ноль за счет, но вы решаете это, добавляя NVL поверх этого ...