Requête T-SQL Group By et Sub

Je suis conscient de ce que le problème est avec ma requête, mais j'ai vraiment du mal à find une solution ici.

SQL Fiddle

Je suppose que je ne suis même pas vraiment sûr de savoir comment requestr cela. Ce que j'essaie de réaliser résume tous les numéros de suivi d'une plage de dates groupée par twig, mais (et c'est le kicker) inclut tous les autres loggings de la sum ayant le même numéro de suivi. J'ai pensé à faire quelque chose comme ça, mais bien sûr SQL Server n'aime pas ça parce que je ne peux pas avoir de sous-requête dans une fonction d'agrégat.

MAX((select SUM(demo.NegotiatedRate) where #demo.Tracking = demo2.Tracking)) as NegotiatedRate

Voici la requête que j'ai jusqu'à présent si quelqu'un ne veut pas cliquer sur le lien SQL Fiddle

 select demo.Branch, SUM(demo.NegotiatedRate) as NegotiatedRate, SUM(demo2.BillRate) as BillRate from demo join demo2 on demo2.Tracking = demo.Tracking where demo.ShipDate = '2014-05-01' group by demo.Branch 

Production attendue

Le résultat que j'essaye de réaliser ressemblerait à ceci. Le taux et le taux de GH6 négociés par GH6 doivent correspondre même si l'une des inputs GH6 tombe en dehors de la plage de dates souhaitée.

 Branch NegotiatedRate BillRate GH4 50 50 GH6 25 25 

Vous pouvez pré-projeter les totaux globaux (non liés à la plage de dates, non filtrés) dans une table dérivée distincte ou cte, puis vous y rallier:

 WITH totals AS ( SELECT demo.Tracking, SUM(demo.NegotiatedRate) as NegotiatedRate from demo group by demo.Tracking ) select demo.Branch, MIN(totals.NegotiatedRate) as NegotiatedRate, SUM(demo2.BillRate) as BillRate from demo join demo2 on demo2.Tracking = demo.Tracking join totals on totals.Tracking = demo.Tracking where demo.ShipDate = '2014-05-01' group by demo.Branch; 

SqlFiddle ici

Étant donné qu'il ne devrait y avoir qu'un seul NegotiatedRate par suivi, vous pouvez contourner le besoin d'append les totals.NegotiatedRate à la requête externe en appliquant un agrégat (j'ai utilisé MIN ), bien que ce soit juste pour pacifier Sql.

Comme une réponse un peu plus simple, vous pouvez faire quelque chose comme:

 SELECT demo.Branch, SUM(demo.NegotiatedRate) AS NegotiatedRate, demo2.BillRate FROM demo JOIN demo2 on demo2.Tracking = demo.Tracking WHERE demo.Tracking IN ( SELECT Tracking FROM demo WHERE ShipDate = '2014-05-01' ) GROUP BY demo.Branch, demo2.BillRate 

Si je comprends bien, vous obtenez tous les numéros de suivi que vous voulez dans une certaine plage de dates, puis get toutes les informations à partir de ces numéros de suivi, peu importe la plage de dates. Puis les regroupe par twig et BillRate, les deux doivent être une valeur pour chaque numéro de suivi.

Si je comprends bien, vous voulez inclure toutes les lignes lorsque l'une des dates est la date sélectionnée. Si c'est correct, alors vous voulez la logique dans la clause having , pas dans la clause where :

 select demo.Branch, SUM(demo.NegotiatedRate) as NegotiatedRate, SUM(demo2.BillRate) as BillRate from demo join demo2 on demo2.Tracking = demo.Tracking group by demo.Branch having sum(case when demo.ShipDate = '2014-05-01' then 1 else 0 end) > 0