2015-10-29 67 views
-3

我試圖在沒有爲特定日期找到記錄時在「nb」字段中顯示0。現在輸出是0行,除非我指定的日期存在於「Commande」表中。當沒有記錄被發現時,SQL服務器顯示計數爲0

SELECT  
    isnull(COUNT(*), 0) as nb, 
    CONVERT(date, c.Date_commande) as Date_commande, 
    f.Code_fournis 
FROM  Commande c 
LEFT JOIN Fournisseur f 
ON   c.Code_fournis = f.Code_fournis 
WHERE  f.Code_fournis = 'XNZ' 
AND   Convert(date, c.Date_commande) = '2015-10-28' 
GROUP BY CONVERT(date, c.Date_commande), f.Code_fournis 
ORDER BY c.date_commande desc 
+0

沒有NULL,根本沒有行。這是因爲你的查詢沒有任何行因爲where子句而返回。有很多方法可以處理這個問題。您可以使用EXISTS檢查並返回硬編碼值NOT EXISTS。 –

+0

只是一個評論,你的左連接作爲一個常規的內連接執行......將f.Code_fournis ='XNZ'從WHERE移到ON以獲得真正的左連接行爲。 – jarlh

回答

-1

即使這是舊的,有幾個downvotes,最近我解決我的問題。我必須生成一個包含日期的表格。

SELECT  SUM(CONVERT(int, case(vtl.oeil) WHEN RTRIM('I') THEN 2 ELSE 1 END)) as nb, 
      CONVERT(date, c.Date_commande) as Date_commande, 
      RTRIM(f.Code_fournis) AS Code_fournis 
FROM  Commande c 
LEFT JOIN Fournisseur f 
ON   c.Code_fournis = f.Code_fournis 
WHERE  c.Code_fournis = 'XNZ' 
AND   Convert(date, c.Date_commande) 
BETWEEN  '2015-11-30' 
AND   '2015-12-04' 
GROUP BY CONVERT(date, c.Date_commande), f.Code_fournis 
UNION ALL 
SELECT  '0', date, 'XNZ' 
FROM  allDates 
WHERE  date  
BETWEEN  '2015-11-30' 
AND   '2015-12-04' 
AND date NOT IN (
     SELECT  convert(date, c.Date_commande) as date 
     FROM  allDates ad 
     INNER JOIN Commande c 
     ON   ad.date = convert(date, c.Date_commande) 
     WHERE  c.Code_fournis = 'XNZ' 
     and   convert(date, c.Date_commande) 
     BETWEEN  '2015-11-30' 
     AND   '2015-12-04' 
) 
ORDER BY c.date_commande asc 

這與我所要求的有點不同,但希望它可以幫助某人。

-1

,因爲「2015年10月28日」不存在COMMANDE,你需要在一個虛表來創建一個行吧:

SELECT  
    SUM(case when c.Date_commande is null then 0 else 1 end) as nb, 
    d.Date_commande as Date_commande, 
    f.Code_fournis 
FROM (values(cast('20150101' as date), 'XNZ') as d(Date_commande, Code_fournis)  
LEFT JOIN Commande c on Cast(c.Date_commande as date) = d.Date_commande 
LEFT JOIN Fournisseur f 
ON   c.Code_fournis = f.Code_fournis and f.Code_fournis = d.Code_fournis 
GROUP BY d.Date_commande, f.Code_fournis 
ORDER BY d.Date_commande desc 

這會工作,以及:

SELECT isnull(COUNT(*), 0) as nb, 
    CONVERT(date, c.Date_commande) as Date_commande, 
    f.Code_fournis 
From your query 
Union All 
Select 0, '20150101', 'XNZ' 
Where not exist (
    select 1 
    From Commande c 
    LEFT JOIN Fournisseur f 
    ON c.Code_fournis = f.Code_fournis and = d.Code_fournis 
    Where f.Code_fournis = 'XNZ' 
     AND Convert(date, c.Date_commande) = '20150101' 
) 
+1

你仍然有一個'where'語句讓你留下連接無用。 –

+0

第1張表上沒有where子句 –

+0

您沒有行,因爲沒有行滿足您的where子句。 –

0

問題是你不能指望什麼是不存在的。您需要爲所有日期創建一個表allDates。 100年意味着36,500行,所以是一張小桌子。使用這一個爲例

How can I generate a temporary table filled with dates in SQL Server 2000?

然後

SELECT  
    isnull(COUNT(*), 0) as nb, 
    CONVERT(date, AD.date) as Date_commande, 
    f.Code_fournis 
FROM   
      allDates AD 
LEFT JOIN Commande c 
     ON AD.date = CONVERT(date, c.Date_commande) 
LEFT JOIN Fournisseur f 
     ON c.Code_fournis = f.Code_fournis 
WHERE  f.Code_fournis = 'XNZ' 
AND   Convert(date, c.Date_commande) = '2015-10-28' 
GROUP BY CONVERT(date, AD.date), f.Code_fournis 
ORDER BY AD.date desc 
+0

我創建了一個表wi日期和我試過你的查詢,它不會返回行 – Sibanak

+0

以及我沒有你的模式,所以我不能測試它。每次只需添加一個表格。也許是'convert(date)'的連接條件...或者在http://sqlfiddle.com/中準備一個示例模式 –

相關問題