2013-10-07 183 views
7

良好的一天,每個人都在這裏是我的代碼計數返回空白,而不是0

SELECT 
    'Expired Item -'+ DateName(mm,DATEADD(MM,4,AE.fld_LOAN)) as [Month] 
    ,COUNT(PIT.fld_ID)'COUNT' 
    ,SUM (PIT.fld_GRAM)'GRAMS' 
    ,SUM (PH.fld_AMNT)'PRINCIPAL' 
FROM #AllExpired AE 
    INNER JOIN Transactions.tbl_ITEM PIT 
    ON AE.fld_MAINID=PIT.fld_MAINID 
    INNER JOIN Transactions.tbl_HISTO PH 
    ON AE.fld_MAINID =PH.fld_MAINID 
GROUP BY DATENAME(MM,(DATEADD(MM,4,AE.fld_LOAN))) 

我所面臨的問題是,我計數函數不返回0,如果它沒有價值,總和功能如果沒有檢索到結果值,則不會返回NULL,而只是輸出空白,爲什麼會這樣呢?我該如何解決它?

這裏是樣本輸出

A

的屏幕截圖ofcourse這不是我想要的我希望它輸出零和空值。請幫助我,我不知道什麼是錯的。謝謝。

+2

您希望在「Month」列中出現什麼值 - SQL Server是否必須神奇地爲此創建一個值? –

+1

但是,如果有* no *行要處理 - 所需結果的條件是0 - 計算它的起始條件是什麼? –

+0

ohhh我現在看到我明白了:)謝謝@Damien_The_Unbeliever你再次幫助我這次:) – user2705620

回答

10

你不能指望使用時,可以輸出任何記錄GROUP BY子句中,當源中不存在任何記錄時。

如果您希望SUM和COUNT函數的輸出爲0,則不應使用GROUP BY。

原因是當你沒有記錄時,GROUP BY子句沒有任何東西可以分組,然後也不能給你任何輸出。

例如:

SELECT COUNT(*) FROM (SELECT 'Dummy' AS [Dummy] WHERE 1 = 0) DummyTable 

會返回一個記錄,其值爲 '0',其中爲:

SELECT COUNT(*) FROM (SELECT 'Dummy' AS [Dummy] WHERE 1 = 0) DummyTable 
GROUP BY [Dummy] 

將返回任何記錄。

+0

爲什麼我使用GROUP BY的原因是因爲這個錯誤 '消息8120,級別16,狀態1,行2列 「#AllExpired.fld_LoanDate」在選擇列表中無效,因爲它不包含的在集合函數或GROUP BY子句中.' 任何建議?如何使用group by刪除錯誤? – user2705620

+0

那麼,如果您想要每個貸款日期月的總計數,克數和本金列表,則無法刪除GROUP BY子句。一個醜陋的解決方法,如果你想你的原始查詢返回一個0的行,當沒有記錄時,是添加類似這樣的查詢:'UNION SELECT NULL AS [Month],0 AS [COUNT],0 AS [GRAMS],0 AS [PRINCIPAL] WHERE(SELECT COUNT(*)FROM #AllExpired)= 0',但更好的解決方案是讓您的應用程序處理原始查詢而不返回任何行。 – Dan

+0

還有其他解決此問題的方法,當結果爲NULL時,還可以對每個字段使用'COALESCE'來返回0。或者使用相關的子查詢以確保總是返回「頂級」數據,任何聚合函數將返回0. – Tony

1

也許#AllExpired爲空,其中一個連接返回無結果?

記住內部連接需要在雙方都返回結果,因爲#AllExpired是空的連接不會返回任何內容。

將其更改爲外部連接。

+0

是的,它是空的,好嗎?它不應該輸出零?當我使用函數計數>? – user2705620

2

我可以想象你需要改變內蒙古您加入到OUTER確保即使存在tbl_PawnItem沒有相應的記錄行返回 -

SELECT 
    'Expired Item -'+ DateName(mm,DATEADD(MM,4,AE.fld_LoanDate)) as [Month] 
    ,COUNT(PIT.fld_PawnItemID)'COUNT' 
    ,SUM (PIT.fld_KaratGram)'GRAMS' 
    ,SUM (PH.fld_PrincipalAmt)'PRINCIPAL' 
FROM #AllExpired AE 
    LEFT JOIN Transactions.tbl_PawnItem PIT 
     ON AE.fld_PawnMainID=PIT.fld_PawnMainID 
    LEFT JOIN Transactions.tbl_PawnHisto PH 
     ON AE.fld_PawnMainID=PH.fld_PawnMainID 
GROUP BY DATENAME(MM,(DATEADD(MM,4,AE.fld_LoanDate))) 
+0

仍然空白。 :(。 – user2705620