Link to home
Start Free TrialLog in
Avatar of TBSupport
TBSupport

asked on

T-SQL CASE Statement

Hello:

Below is a select statement pulling fields of data from another select statement.  The "Month" field is formatted and returned as "Month 01", "Month 02", "Month 03", etc. through "Month 18".

When I run this statement against our data, some months legitimately do not appear.  Month 02 is an example.  There are no purchase orders for that month and, therefore, it does not show when selected.

But, I would like to show fields of data for Month 02 and any other "missing months".

So, I would like to have a single line of data representing Month 02 but have all other fields for that line be blank or 0.

How can I accomplish this?

Truthfully, I started with the second "big" select statement.  When I could not find a way to add missing months in it, I "added" the first select statement that is wrapped around the select case statement.  (I hope that makes sense.)

Thanks!

TBSupport



select
ContractNum, VENDORID, StartDate, EndDate, Month, ITEMNMBR, ITEMDESC, AvailQuantity, EXTDCOST
 FROM(
select RCG.dbo.POContractHeader.ContractNum, RCG.dbo.POContractHeader.VENDORID, RCG.dbo.POContractHeader.StartDate, RCG.dbo.POContractHeader.EndDate,
'Month ' +
CASE WHEN DATEDIFF(m,GETDATE(),RCG.dbo.POContractHeader.EndDate) + 1 < 10
THEN CAST(CAST('0' AS VARCHAR) + CAST(DATEDIFF(m,GETDATE(),RCG.dbo.POContractHeader.EndDate) + 1 AS VARCHAR(1)) AS VARCHAR(2))
ELSE CAST(DATEDIFF(m,GETDATE(), RCG.dbo.POContractHeader.EndDate) + 1 AS VARCHAR(2))
END
AS Month,
--RCG.dbo.PODraws.PONUMBER,
RCG.dbo.POContractDetail.ITEMNMBR, RCG.dbo.POContractDetail.ITEMDESC, RCG.dbo.POContractDetail.AvailQuantity, RCG.dbo.POContractDetail.EXTDCOST
from RCG.dbo.POContractHeader
INNER JOIN RCG.dbo.POContractDetail on RCG.dbo.POContractHeader.ContractNum = RCG.dbo.POContractDetail.ContractNum
and RCG.dbo.POContractHeader.VENDORID = RCG.dbo.POContractDetail.VENDORID
INNER JOIN RCG.dbo.PODraws on RCG.dbo.POContractDetail.ContractNum = RCG.dbo.PODraws.ContractNum
and RCG.dbo.POContractDetail.VENDORID = RCG.dbo.PODraws.VENDORID
where RCG.dbo.POContractHeader.StartDate IS NOT NULL and RCG.dbo.POContractHeader.EndDate IS NOT NULL
and RCG.dbo.POContractDetail.AvailQuantity <> 0
and (RCG.dbo.POContractHeader.EndDate >= DATEADD(m, DATEDIFF(m, 0, GETDATE()), 0)) AND
(RCG.dbo.POContractHeader.EndDate < DATEADD(m, DATEDIFF(m, 0, GETDATE()) + 18, 0))
and RCG.dbo.POContractHeader.VENDORID = '8000028'
GROUP BY RCG.dbo.POContractHeader.VENDORID,
RCG.dbo.POContractHeader.ContractNum,
RCG.dbo.POContractHeader.StartDate, RCG.dbo.POContractHeader.EndDate,
RCG.dbo.POContractDetail.ITEMNMBR, RCG.dbo.POContractDetail.ITEMDESC, RCG.dbo.POContractDetail.AvailQuantity, RCG.dbo.POContractDetail.EXTDCOST--,
--RCG.dbo.PODraws.PONUMBER,
) as test
--ORDER BY RCG.dbo.POContractHeader.VENDORID, RCG.dbo.POContractHeader.EndDate
ASKER CERTIFIED SOLUTION
Avatar of chaau
chaau
Flag of Australia image

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
If you have months from 01 to 18, you can hardcode them like this in a sub-query and LEFT JOIN your actual query.
SELECT ContractNum, 
       VENDORID, 
       StartDate, 
       EndDate, 
       t1.[Month], 
       ITEMNMBR, 
       ITEMDESC, 
       AvailQuantity, 
       EXTDCOST 
  FROM (SELECT 'Month01' [Month] 
        UNION ALL 
        SELECT 'Month02' 
        UNION ALL 
        SELECT 'Month03' 
        UNION ALL 
        SELECT 'Month04' 
        UNION ALL 
        SELECT 'Month05' 
        UNION ALL 
        SELECT 'Month06' 
        UNION ALL 
        SELECT 'Month07' 
        UNION ALL 
        SELECT 'Month08' 
        UNION ALL 
        SELECT 'Month09' 
        UNION ALL 
        SELECT 'Month10' 
        UNION ALL 
        SELECT 'Month11' 
        UNION ALL 
        SELECT 'Month12' 
        UNION ALL 
        SELECT 'Month13' 
        UNION ALL 
        SELECT 'Month14' 
        UNION ALL 
        SELECT 'Month15' 
        UNION ALL 
        SELECT 'Month16' 
        UNION ALL 
        SELECT 'Month17' 
        UNION ALL 
        SELECT 'Month18') t1 
       LEFT JOIN (SELECT RCG.DBO.POContractHeader.ContractNum, 
                         RCG.DBO.POContractHeader.VENDORID, 
                         RCG.DBO.POContractHeader.StartDate, 
                         RCG.DBO.POContractHeader.EndDate, 
                         'Month ' + CASE WHEN DATEDIFF(M, GETDATE(), RCG.DBO.POContractHeader.EndDate) + 1 < 10 THEN CAST(CAST('0' AS VARCHAR) + CAST(DATEDIFF(M, GETDATE(), RCG.DBO.POContractHeader.EndDate) + 1 AS VARCHAR(1)) AS VARCHAR(2)) ELSE CAST(DATEDIFF(M, GETDATE(), RCG.DBO.POContractHeader.EndDate) + 1 AS VARCHAR(2)) END AS [Month],
                         --RCG.dbo.PODraws.PONUMBER,  
                         RCG.DBO.POContractDetail.ITEMNMBR, 
                         RCG.DBO.POContractDetail.ITEMDESC, 
                         RCG.DBO.POContractDetail.AvailQuantity, 
                         RCG.DBO.POContractDetail.EXTDCOST 
                    FROM RCG.DBO.POContractHeader 
                         INNER JOIN RCG.DBO.POContractDetail 
                                 ON RCG.DBO.POContractHeader.ContractNum = RCG.DBO.POContractDetail.ContractNum
                                    AND RCG.DBO.POContractHeader.VENDORID = RCG.DBO.POContractDetail.VENDORID
                         INNER JOIN RCG.DBO.PODraws 
                                 ON RCG.DBO.POContractDetail.ContractNum = RCG.DBO.PODraws.ContractNum
                                    AND RCG.DBO.POContractDetail.VENDORID = RCG.DBO.PODraws.VENDORID
                   WHERE RCG.DBO.POContractHeader.StartDate IS NOT NULL 
                     AND RCG.DBO.POContractHeader.EndDate IS NOT NULL 
                     AND RCG.DBO.POContractDetail.AvailQuantity <> 0 
                     AND ( RCG.DBO.POContractHeader.EndDate >= DATEADD(M, DATEDIFF(M, 0, GETDATE()), 0) )
                     AND ( RCG.DBO.POContractHeader.EndDate < DATEADD(M, DATEDIFF(M, 0, GETDATE()) + 18, 0) )
                     AND RCG.DBO.POContractHeader.VENDORID = '8000028' 
                   GROUP BY RCG.DBO.POContractHeader.VENDORID, 
                            RCG.DBO.POContractHeader.ContractNum, 
                            RCG.DBO.POContractHeader.StartDate, 
                            RCG.DBO.POContractHeader.EndDate, 
                            RCG.DBO.POContractDetail.ITEMNMBR, 
                            RCG.DBO.POContractDetail.ITEMDESC, 
                            RCG.DBO.POContractDetail.AvailQuantity, 
                            RCG.DBO.POContractDetail.EXTDCOST--,  
                 --RCG.dbo.PODraws.PONUMBER,  
                 ) AS test 
              ON t1.[Month] = t2.[Month] 
--ORDER BY RCG.dbo.POContractHeader.VENDORID, RCG.dbo.POContractHeader.EndDate

Open in new window

Avatar of TBSupport
TBSupport

ASKER

Thanks, All, for the responses!

Sharath_123>> I think that your "[Month]" is out of place.  Can you check, again, and update the case?  

Also, where is "t2"?

TBSupport
chaau>>Your solution works really well!  Thank you!  Question:  Is there a way for me to get the EXTDCOST to return "0" instead of "NULL"?
Sure, use ISNULL(), like this:
.....
select 
ContractNum, VENDORID, StartDate, EndDate, m.Month, ITEMNMBR, ITEMDESC, AvailQuantity, ISNULL(EXTDCOST,0) AS EXTDCOST
......

Open in new window

>>  I think that your "[Month]" is out of place.
What do you mean?

>> Also, where is "t2"?
replace t2 with test.