2016-02-25 2 views
0

Я хочу показать 0 или что-то, что я хочу, когда нет данных. И это мой запрос.Как показать 0, когда нет данных

SELECT `icDate`,IFNULL(SUM(`icCost`),0) AS icCost 
FROM `incomp` 
WHERE (`icDate` BETWEEN "2016-01-01" AND "2016-01-05") 
    AND `compID` = "DDY" 
GROUP BY `icDate` 

И это результат этого запроса.

icDate | icCost 
-------------------------- 
2016-01-01 | 1000.00 
2016-01-02 | 2000.00 
2016-01-03 | 3000.00 
2016-01-04 | 4000.00 
2016-01-05 | 5000.00 

Если каждый день я хочу показать данные, которые он имеет данные, это было не problem.but это есть день, это не данные. Это не покажет этот день, Как это.

icDate | icCost 
-------------------------- 
2016-01-01 | 1000.00 
2016-01-02 | 2000.00 
2016-01-04 | 4000.00 
2016-01-05 | 5000.00 

Но я хочу, чтобы он мог показывать данные следующим образом.

icDate | icCost 
-------------------------- 
2016-01-01 | 1000.00 
2016-01-02 | 2000.00 
2016-01-03 |  0.00 
2016-01-04 | 4000.00 
2016-01-05 | 5000.00 

Как написать запрос, чтобы получить этот ответ. Спасибо.

+3

Создайте таблицу календаря, выполните внешнее соединение. – jarlh

+0

Никаких обещаний, но похоже, что CTE может быть полезной здесь – allie

+0

Не совсем дубликат, но следующие могут быть полезны: http://stackoverflow.com/questions/9295616/how-to-get-list-of -dates-between-two-dates-in-mysql-select-query/9296238 # 9296238 –

ответ

-1

Извините за мой более ранний ответ. Я дал ответ MSSQL вместо ответа MySQL.

Вам нужна таблица календаря, чтобы иметь набор всех дат в вашем диапазоне. Это может быть постоянная таблица или временная таблица. В любом случае, существует множество способов его заполнения. Вот один из способов (заимствовано из here):

set @beginDate = '2016-01-01'; 
set @endDate = '2016-01-05'; 

create table DateSequence(Date Date); 
insert into DateSequence 
select * from 
(select adddate('1970-01-01',t4.i*10000 + t3.i*1000 + t2.i*100 + t1.i*10 + t0.i) selected_date from 
(select 0 i union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t0, 
(select 0 i union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t1, 
(select 0 i union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t2, 
(select 0 i union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t3, 
(select 0 i union select 1 union select 2 union select 3 union select 4 union select 5 union select 6 union select 7 union select 8 union select 9) t4) v 
where selected_date between @beginDate and @endDate 

Лучше всего, вероятно, чтобы сделать постоянную таблицу, которая имеет все возможные даты. Таким образом, вам нужно только заполнить его один раз, и он готов к работе, когда вам это нужно.

Теперь вы можете подключиться к таблице календаря с помощью таблицы inComp.

set @beginDate date = '2016-01-01' 
set @endDate date = '2016-01-05' 

select d.Date, 
sum(ifnull(i.icCost, 0)) inComp 
from DateSequence d 
left outer join inComp i on i.icDate = d.Date 
where d.Date between @beginDate and @endDate 
and i.compID = 'DDY' 
group by d.date 
order by d.Date; 
+0

Вопрос помечен 'Mysql' –

+4

CTE - это MS SQL Server, этот вопрос предназначен для MySQL – jclozano

+0

@jclozano - Even ** Oracle ** & ** Postgres * * поддерживает 'CTE' –

0

Я сделал симуляцию, но я не мог видеть вашу проблему. Я создал таблицу для teste, и после ввода данных это был мой выбор. Но тест был нормальным!

SELECT icDate, 
format(ifnull(sum(icCost), 0),2) as icCost, 
count(icDate) as entries 
FROM incomp 
WHERE icDate BETWEEN '2016-01-01' AND '2016-01-05' 
AND compID = 'DDY' 
group by icDate; 

Это результат моего теста, экспортируемые в CSV файл:

icDate  | icCost | entries 
---------------------------------- 
2016-01-01 | 8,600.00 | 8  
2016-01-02 | 5,600.00 | 4  
2016-01-03 | 5,400.00 | 3  
2016-01-04 | 0.00  | 1  
2016-01-05 | 7,050.00 | 7 

ли поле icCost устанавливает со значением нуль или номер ноль? Помните о некоторых случаях, когда установленные значения нуля могут отличаться от других, как пустые.

+0

Я думаю, что проблема в том, что есть дни, когда вообще нет записи (а не только нулевое значение в поле icCost), но он все еще хочет, чтобы на тот день появился нуль. – Jerrad

+0

Спасибо, но это не работает. – ThunderBirdsX3

0

Я нашел ответы, Он работал с календарной таблицей.

SELECT tbd.`db_date`, 
    (SELECT IFNULL(SUM(icCost),0) AS icCost 
    FROM `incomp` 
    WHERE icDate = tbd.db_date 
     AND compID = "DDY" 
    )AS icCost 
FROM tb_date AS tbd 
WHERE (tbd.`db_date` BETWEEN "2016-01-01" AND "2016-01-05") 
GROUP BY tbd.`db_date` 
LIMIT 0,100 

Просто, но работа.

0

Хорошо, вы можете исследовать, правильно ли заполнен стол каждый день. Сначала вы можете создать временную таблицу следующим образом:

CREATE TEMPORARY TABLE myCalendar (
    CalendarDate date primary key not null 
); 

Итак, после заполнения этой таблицы действительными днями.Для этого, используйте эту процедуру:

DELIMITER $$ 
CREATE PROCEDURE doWhile() 

BEGIN 

    # IF YOU WANT TO USE CURRENT MONTH 
    #SET @startCount = ADDDATE(LAST_DAY(SUBDATE(CURDATE(), INTERVAL 1 MONTH)), 1); 
    #SET @endCount = LAST_DAY(sysdate()); 
    # USE TO SET A DATE 
    SET @startCount = '2016-01-01'; 
    SET @endOfCount = '2016-01-30'; 

    WHILE @startCount <= @endOfCount DO 

    INSERT INTO myCalendar (CalendarDate) VALUES (@startCount); 
    SET @startCount = date_add(@startCount, interval 1 day); 

    END WHILE; 

END$$; 

DELIMITER ; 

Вы должны выполнить эту процедуру с помощью команды:

CALL doWhile(); 

Теперь запустите следующие файлы:

SELECT format(ifnull(sum(t1.icCost), 0),2) as icCost, 
      ifnull(t1.icDate, 'Not found') as icDate, 
      t2.CalendarDate as 'For the day' 
    from incomp t1 
      right join myCalendar t2 ON 
    t2.CalendarDate = t1.icDate group by t2.CalendarDate; 

Я думаю, что это поможет вам найти решение, например, если существует регистр на день или нет.

Надеюсь, это может вам помочь!

[]

Смежные вопросы