我想在没有数据时显示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
如何编写查询以获得此答案。谢谢。
答案 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;