2017-12-30 54 views
0

Ein Kunde kann mehrere Vereinbarungen haben, und jede Vereinbarung hat mehrere Produkte (d. H. A - H im Bild unten). Ich habe die folgende Abfrage geschrieben, die mir die Produktanzahl für jede Vereinbarung angibt. Ich verwende dann RowNum, um die Vereinbarung und das AgreementEndDate zu bestimmen, die dem heutigen Tag am nächsten sind.SQL Query Zusammenfassung Zeile

Was ich jedoch zurückgeben muss, ist RowNum = 1 ist: a) AgreementEndDate, das dem heutigen Tag am nächsten kommt (und assoziierte AgreementID und AgreementEffectiveDate) und eine Zusammenfassung des Kaufs von Produkten.

So rownum 1 =

  • AgreementID = 73838545
  • AgreementEffectiveDate = 2015-05-28
  • AgreementEndDate = 2018-05-31
  • A = 1
  • B = 1
  • C = 1
  • D = 1
  • E = 1
  • F = 1
  • G = 1
  • H = 0

enter image description here

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 
+1

'und eine Zusammenfassung des Produktkaufs '- großartig: Was ist Ihr Produkttisch? Was hast du bisher versucht und was blockiert dich? Außerdem gibt es nicht wirklich etwas wie ein "Enddatum der Vereinbarung" - es gibt ein "Datum, an dem die Vereinbarung nicht mehr wirksam ist", das sich subtil unterscheidet (exklusive obere Grenze statt inklusive oberer Grenze) –

+0

Es gibt niemanden Produkttabelle. Ich muss mich tatsächlich mit 8 anderen Tischen verbinden. Statt LA * habe ich versucht. LA.CustomerID , sum ([A-Abkommen}) , sum ([B-Abkommen}) , sum ([C Agreement}) , sum ([D-Abkommen }) ... und so weiter. Aber ich bekomme die gleichen Ergebnisse. Und ja, Sie haben Recht, es gibt wirklich kein Enddatum, aber die Vereinbarung ist nicht mehr in Kraft. – emie

+1

... können wir die Beispieldaten und die Ergebnisdaten, die Sie sehen möchten, erhalten? Wenn Sie sagen, dass diese Tabelle bereits zusammenfassende Daten enthält und Sie nicht auf die anderen Tabellen zugreifen müssen, ist das in Ordnung. –

Antwort

0

ich die Lösung Bezifferung endete. Ich habe gerade einen inneren Join hinzugefügt. Sobald ich das getan habe, hat alles funktioniert.

Dies ist nicht der beste Weg, aber es funktioniert.

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