Good Day Every one

i have this code

 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)))

and it works fine, the problem is that when the Select statements retrieved no rows they become empty instead of replacing zeroes

instead of Generating the word month with 0 0 0 it just pops out empty in which i dont like,,

can you help me achive that? the result should be something like this

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

here is my code to generate the items inside 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)

i hope you can help me because im just a starter in sql

i have tried using is NULL as what you have seen above but i do not know if i implement it correctly

Hoping for your Kindness and consideration thank you :)

****EDIT**

The temp tables contains no values to start with, i just want it to output 0 instead of blank.

有帮助吗?

解决方案

Edited: Added a months table to handle empty temp tables.

Change inner joins to left joins.

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

其他提示

Try this in your select

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

Though both answers do what the questioner wanted, I though I would suggest 'where LoanDate in (range)', 'group by', along with left join, and a date range.

So, you have tables like this:

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
);

This is proximately what I'm suggesting (I don't have my laptop, so no mysql right now),

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);
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top