Reputation: 289
A customer can have multiple Agreements, and each Agreement has multiple products (i.e. A - H in the image below). I wrote the following query that give me the product count for each Agreement. I then use RowNum to determine the Agreement and AgreementEndDate closest to today.
However, what I need to return is RowNum = 1 is: a) AgreementEndDate closest to today (and associated AgreementID and AgreementEffectiveDate) and a summary of products purchase.
So, RowNum 1 =
Select
LA.*
from
(select
CustomerID
,AgreementID
,min(CONVERT(char(10), AgreementEffectiveDate,126)) as 'AgreementEffectiveDate'
,min(CONVERT(char(10), AgreementEndDate,126)) as 'AgreementEndDate'
,(CASE WHEN sum(cast([A Agreement] as float)) >= 1 THEN 1 ELSE 0 END) as 'A Agreement'
,(CASE WHEN sum(cast([B Agreement] as float)) >= 1 THEN 1 ELSE 0 END) as 'B Agreement'
,(CASE WHEN sum(cast([C Agreement] as float)) >= 1 THEN 1 ELSE 0 END) as 'C Agreement'
,(CASE WHEN sum(cast([D Agreement] as float)) >= 1 THEN 1 ELSE 0 END) as 'D Agreement'
,(CASE WHEN sum(cast([E Agreement] as float)) >= 1 THEN 1 ELSE 0 END) as 'E Agreement'
,(CASE WHEN sum(cast([F Agreement] as float)) >= 1 THEN 1 ELSE 0 END) as 'F Agreement'
,(CASE WHEN sum(cast([G Agreement] as float)) >= 1 THEN 1 ELSE 0 END) as 'G Agreement'
,(CASE WHEN sum(cast([H Agreement] as float)) >= 1 THEN 1 ELSE 0 END) as 'H Agreement'
,ROW_NUMBER() OVER(PARTITION BY TPID ORDER BY AgreementEndDate ASC) AS RowNum
from LicenseAgreement
Group by CustomerID, AgreementID, AgreementEndDate
) LA
where TPID = '1789' --and RowNum = 1
order by RowNum, CustomerID, AgreementID, AgreementEndDate
Upvotes: 0
Views: 74
Reputation: 289
I ended up figuring the solution. I just added an inner join. Once I did this, everything worked.
This isn't the best way but it works.
Select
B.ID
,B.AgreementID
,B.AgreementEffectiveDate
,B.AgreementEndDate
,(CASE WHEN sum(cast(LA.[A Agreement] as float)) >= 1 THEN 1 ELSE 0 END) as 'A Agreement'
,(CASE WHEN sum(cast(LA.[B Agreement] as float)) >= 1 THEN 1 ELSE 0 END) as 'BAgreement'
,(CASE WHEN sum(cast(LA.[C Agreement] as float)) >= 1 THEN 1 ELSE 0 END) as 'C Agreement'
,(CASE WHEN sum(cast(LA.[D Agreement] as float)) >= 1 THEN 1 ELSE 0 END) as 'D Agreement'
,(CASE WHEN sum(cast(LA.[E Agreement] as float)) >= 1 THEN 1 ELSE 0 END) as 'E Agreement'
,(CASE WHEN sum(cast(LA.[F Agreement] as float)) >= 1 THEN 1 ELSE 0 END) as 'F Agreement'
,(CASE WHEN sum(cast(LA.[G Agreement] as float)) >= 1 THEN 1 ELSE 0 END) as 'G Agreement'
,(CASE WHEN sum(cast(LA.[H Agreement] as float)) >= 1 THEN 1 ELSE 0 END) as 'H Agreement'
from
(select
TPID
,(CASE WHEN sum(cast([A Agreement] as float)) >= 1 THEN 1 ELSE 0 END) as 'A Agreement'
,(CASE WHEN sum(cast([B Agreement] as float)) >= 1 THEN 1 ELSE 0 END) as 'B Agreement'
,(CASE WHEN sum(cast([C Agreement] as float)) >= 1 THEN 1 ELSE 0 END) as 'C Agreement'
,(CASE WHEN sum(cast([D Agreement] as float)) >= 1 THEN 1 ELSE 0 END) as 'D Agreement'
,(CASE WHEN sum(cast([E Agreement] as float)) >= 1 THEN 1 ELSE 0 END) as 'E Agreement'
,(CASE WHEN sum(cast([F Agreement] as float)) >= 1 THEN 1 ELSE 0 END) as 'F Agreement'
,(CASE WHEN sum(cast([G Agreement] as float)) >= 1 THEN 1 ELSE 0 END) as 'G Agreement'
,(CASE WHEN sum(cast([H Agreement] as float)) >= 1 THEN 1 ELSE 0 END) as 'H Agreement'
from LicenseAgreement
Group by ID, AgreementID, AgreementEndDate, AgreementEffectiveDate
) LA
inner join (select
TPID
,AgreementID
,min(CONVERT(char(10), AgreementEffectiveDate,126)) as 'AgreementEffectiveDate'
,min(CONVERT(char(10), AgreementEndDate,126)) as 'AgreementEndDate'
,ROW_NUMBER() OVER(PARTITION BY ID ORDER BY AgreementEndDate ASC) AS RowNum
from LicenseAgreement
Group by ID, AgreementID, AgreementEndDate, AgreementEffectiveDate
) B ON b.TPID = LA.TPID
where RowNum = 1
group by B.TPID,b.RowNum,b.AgreementID,b.AgreementEffectiveDate,b.AgreementEndDate
order by ID, AgreementID, AgreementEndDate, RowNum
Upvotes: 1