2013-10-04 101 views
1

好一天每一個產生零點時沒有在那裏選擇

我有這樣的代碼行

SELECT 
    'Expired Item -'+ DateName(mm,DATEADD(MM,4,AE.LOAN)) as [Month] 
    ,COUNT(ISNULL(PIT.ID,0))'COUNT' 
    ,SUM(ISNULL(PIT.KGRAM,0))'GRAMS' 
    ,SUM(ISNULL(PH.AMOUNT,0))'PRINCIPAL' 
FROM #AllExpired AE 
    INNER JOIN Transactions.ITEM PIT 
    ON AE.MAINID=PIT.MAINID 
    INNER JOIN Transactions.HISTO PH 
    ON AE.MAINID=PH.MAINID 
GROUP BY DATENAME(MM,(DATEADD(MM,4,AE.LOAN))) 

UNION ALL 

/*SELECT EXPIRED AFTER 5 MONTHS*/ 
SELECT 
    'Expired Item -'+ DateName(mm,DATEADD(MM,5,AE.LOAN)) as [Month] 
    ,COUNT(ISNULL(PIT.ID,0))'COUNT' 
    ,SUM(ISNULL(PIT.KGRAM,0))'GRAMS' 
    ,SUM(ISNULL(PH.AMOUNT,0))'PRINCIPAL' 
FROM #ExpAfterFiveMonths E5 
    INNER JOIN Transactions.ITEM PIT 
    ON E5.MAINID=PIT.MAINID 
    INNER JOIN Transactions.HISTO PH 
    ON E5.MAINID=PH.MAINID 
    INNER JOIN #AllExpired AE 
    ON AE.MAINID=E5.MAINID 
GROUP BY DATENAME(MM,(DATEADD(MM,5,AE.LOAN))) 

UNION ALL 

/*SELECT EXPIRED AFTER 6 MONTHS*/ 
SELECT 
    'Expired Item -'+ DateName(mm,DATEADD(MM,6,AE.LOAN)) as [Month] 
    ,COUNT(ISNULL(PIT.ID,0))'COUNT' 
    ,SUM(ISNULL(PIT.KGRAM,0))'GRAMS' 
    ,SUM(ISNULL(PH.AMOUNT,0))'PRINCIPAL' 
FROM #ExpAfterSixMonths E6 
    INNER JOIN Transactions.ITEM PIT 
    ON E6.MAINID=PIT.MAINID 
    INNER JOIN Transactions.HISTO PH 
    ON E6.MAINID=PH.MAINID 
    INNER JOIN #AllExpired AE 
    ON AE.MAINID=E6.MAINID 
GROUP BY DATENAME(MM,(DATEADD(MM,6,AE.LOAN))) 

,它工作正常,問題是,當選擇語句檢索到的任何行,它們變成空的,而不是更換零

,而不是產生字一個月0 0 0它只是彈出空的,我不喜歡,,

你能幫助我achive嗎?結果應該是這樣的

------------------------------------------------------------------ 
MONTH  | Count |  Grams |  Principal | 
October  |123123 |  123123 | 123123213  | 
November  | 0  |  0  |  0  | // this should appear if no rows where selected instead of blank 

這裏是我的代碼生成內部temptables

SELECT TE.MAINID 
     ,TE.EXPIRY 
     ,TE.LOAN 
     ,PM.STORAGE 
into #AllExpiredAfterFiveAndSix 
FROM #ExpiredAfterFiveandSixMon TE 
    inner join Transactions.TABLEMAIN PM 
    on TE.MAINID = PM.MAINID 
    inner join #AllExpired E4 
    on E4.MAINID=TE.MAINID 
WHERE ((cast(TE.EXPIRY as date) < cast(TE.newloandate as date)) 
     OR(TE.NewLoanDate is null and ((cast(TE.EXPIRY as date) < cast(PM.DATERED as date)) or PM.STATUS = 7 or PM.STATUS = 5))) 
     AND (PM.STORAGE BETWEEN 3 AND 14 OR PM.STORAGE=17) 


/*EXPIRED AFTER 5 MONTHS*/ 
select AE.MAINID 
     ,AE.LOAN 
     ,AE.STORAGE 
     ,ae.EXPIRY 
into #ExpAfterFiveMonths 
from #AllExpiredAfterFiveAndSix AE 
    inner join #AllExpired E4 
    on E4.MAINID=AE.MAINID 
where MONTH(AE.EXPIRY)= MONTH(dateadd(mm,1,E4.EXPIRY)) 
/*EXPIRED AFTER 6 MONTHS*/  
select AE.MAINID 
     ,AE.LOAN 
     ,AE.STORAGE 
     ,ae.EXPIRY 
into #ExpAfterSixMonths 
from #AllExpiredAfterFiveAndSix AE 
    inner join #AllExpired E4 
    on E4.MAINID=AE.MAINID 
where MONTH(AE.EXPIRY)= MONTH(dateadd(mm,2,E4.EXPIRY)) 

CREATE NONCLUSTERED INDEX IDX_ExpAfterFiveMonths ON #ExpAfterFiveMonths(MAINID) 
CREATE NONCLUSTERED INDEX IDX_ExpAfterSixMonths ON #ExpAfterSixMonths(MAINID) 

我希望你能幫助我,因爲我只是在SQL首發

我有項目嘗試使用是NULL作爲你在上面看到,但我不知道我是否正確實施它

希望你的善良和考慮謝謝:)

****編輯**

臨時表不包含任何值,開始時,我只是希望它輸出0,而不是空白。

+0

燦你張貼你的永久表的架構? –

+0

@LloydBanks你的模式是什麼意思?即時通訊對不起,即時通訊新t-sql – user2705620

+0

表格的佈局,所以列名和它們的類型 –

回答

2

編輯:增加了一個個表來處理空的臨時表。

將內連接更改爲左連接。

DECLARE @months TABLE (ReportMonth VARCHAR(20) NOT NULL) 
INSERT INTO @months VALUES 
('January'),('February'),('March'),('April'), 
('May'),('June'),('July'),('August'), 
('September'),('October'),('November'),('December') 


SELECT 
    'Expired Item -'+ COALESCE(DateName(mm,DATEADD(MM,4,AE.fld_LoanDate)), M.ReportMonth) as [Month] 
    ,COUNT(ISNULL(PIT.fld_PawnItemID,0))'COUNT' 
    ,SUM(ISNULL(PIT.fld_KaratGram,0))'GRAMS' 
    ,SUM(ISNULL(PH.fld_PrincipalAmt,0))'PRINCIPAL' 
FROM 
    @months M 
    LEFT JOIN #AllExpired AE 
    ON M.ReportMonth = DateName(mm,DATEADD(MM,4,AE.fld_LoanDate)) 
    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 M.ReportMonth 

UNION ALL 

/*SELECT EXPIRED AFTER 5 MONTHS*/ 
SELECT 
    'Expired Item -'+ 'Expired Item -'+ COALESCE(DateName(mm,DATEADD(MM,5,AE.fld_LoanDate)), M.ReportMonth) as [Month] 
    ,COUNT(ISNULL(PIT.fld_PawnItemID,0))'COUNT' 
    ,SUM(ISNULL(PIT.fld_KaratGram,0))'GRAMS' 
    ,SUM(ISNULL(PH.fld_PrincipalAmt,0))'PRINCIPAL' 
FROM 
    @months M 
    LEFT JOIN #AllExpired AE 
    ON M.ReportMonth = DateName(mm,DATEADD(MM,5,AE.fld_LoanDate)) 
    LEFT JOIN #ExpAfterFiveMonths E5 
    ON AE.fld_PawnMainID=E5.fld_PawnMainID 
    LEFT JOIN Transactions.tbl_PawnItem PIT 
    ON E5.fld_PawnMainID=PIT.fld_PawnMainID 
    LEFT JOIN Transactions.tbl_PawnHisto PH 
    ON E5.fld_PawnMainID=PH.fld_PawnMainID 
GROUP BY M.ReportMonth 

UNION ALL 

/*SELECT EXPIRED AFTER 6 MONTHS*/ 
SELECT 
    'Expired Item -'+ COALESCE(DateName(mm,DATEADD(MM,6,AE.fld_LoanDate)), M.ReportMonth) as [Month] 
    ,COUNT(ISNULL(PIT.fld_PawnItemID,0))'COUNT' 
    ,SUM(ISNULL(PIT.fld_KaratGram,0))'GRAMS' 
    ,SUM(ISNULL(PH.fld_PrincipalAmt,0))'PRINCIPAL' 
FROM 
    @months M 
    LEFT JOIN #AllExpired AE 
    ON M.ReportMonth = DateName(mm,DATEADD(MM,6,AE.fld_LoanDate)) 
    LEFT JOIN #ExpAfterSixMonths E6 
    ON AE.fld_PawnMainID=E6.fld_PawnMainID 
    LEFT JOIN Transactions.tbl_PawnItem PIT 
    ON E6.fld_PawnMainID=PIT.fld_PawnMainID 
    LEFT JOIN Transactions.tbl_PawnHisto PH 
    ON E6.fld_PawnMainID=PH.fld_PawnMainID  
GROUP BY M.ReportMonth 
+0

還是一樣的。請參閱編輯,臨時表是空的。 – user2705620

+0

如果AE表格中沒有數據,則沒有月份名稱可供選擇。您需要建立一個您期望在報告中顯示的月份表格。 –

+0

我建立了一個表格來處理空的臨時表格。 –

1

試試這個在您選擇

SELECT (CASE WHEN (AE.fld_LoanDate IS null) THEN 0 ELSE AE.fld_LoanDate END) as fld_LoanDate 
+0

那點=) –

+0

你是什麼意思? –

+0

沒什麼,只是支持你的答案=) –

0

雖然兩個答案做提問想要的東西,我雖然我會建議「其中LoanDate的(範圍)」,「按組」,用左手沿加盟,和日期範圍。

所以,你的表是這樣的:

CREATE TABLE tPawnItem 
(
    fPawnItemID int auto_increment primary key, 
    fDescription varchar(30), 
    fKaratGram float 
); 
CREATE TABLE tPawnHisto 
(
    fPawnMainID int primary key, 
    fPrincipalAmt int, 
    fRedeemed date 
); 
create table tExp 
(
    fPawnMainID int primary key, 
    fLoanDate date 
); 

這是近因我的建議是什麼(我沒有我的筆記本電腦,所以沒有mysql現在),

SELECT 
    'Expired Item -'+ DATENAME(MM,tExp.fLoanDate) as [Month] 
    ,COUNT(ISNULL(tPawnItem.fPawnItemID,0))'COUNT' 
    ,SUM(ISNULL(tPawnItem.fKaratGram,0))'GRAMS' 
    ,SUM(ISNULL(tPawnHisto.fPrincipalAmt,0))'PRINCIPAL' 
FROM tExp 
    INNER JOIN tPawnItem 
    ON tExp.fPawnMainID=tPawnItem.fPawnMainID 
    INNER JOIN tPawnHisto 
    ON tExp.fPawnMainID=tPawnHisto.fPawnMainID 
WHERE t.Exp.fLoanDate in (
    DATENAME(MM,DATEADD(MM,4,tExp.fLoanDate)), 
    DATENAME(MM,DATEADD(MM,5,tExp.fLoanDate)), 
    DATENAME(MM,DATEADD(MM,6,tExp.fLoanDate)), 
    DATENAME(MM,DATEADD(MM,7,tExp.fLoanDate)) 
) 
GROUP BY DATENAME(MM,tExp.fLoanDate); 
相關問題