2016-02-25 108 views
0

我想顯示0或什麼我想要的時候沒有data.And這是我的查詢。如何顯示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 

如何編寫查詢以獲得此答案。謝謝。

+3

創建一個日曆表,做一個外部連接。 – jarlh

+0

沒有承諾,但它聽起來像一個CTE可能在這裏有一些幫助 – allie

+0

不完全重複,但以下可能會有用:http://stackoverflow.com/questions/9295616/how-to-get-list-of 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's是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; 

我認爲這將幫助你找到一個解決方案,例如,如果存在一天的註冊或不存在。

我希望這可以幫助你!

[]的

相關問題