没有数据时如何显示0

时间:2016-02-25 15:59:14

标签: mysql sql

我想在没有数据时显示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

如果我每天都要显示数据,那么它就有数据,这不是问题。但它有一天,它没有数据。今天不会显示,就像这样。

   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

如何编写查询以获得此答案。谢谢。

4 个答案:

答案 0 :(得分:0)

我进行了模拟,但我看不出你的问题。我为teste创建了一个表,插入数据后这是我的选择。但测试是正常的!

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

这是我的测试结果,在csv文件中导出:

curl_multi_perform

icCost字段是设置为空值还是数字零?请记住,某些情况下,设置的空值可能与其他值不同。

答案 1 :(得分: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

简单地说,但是工作。

答案 2 :(得分: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;

我认为这有助于您找到解决方案,例如,如果存在一天的注册表。

我希望这可以帮到你!

[]&#39; S

答案 3 :(得分:-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;