Est-il possible d'append une deuxième condition où sélectionner ces mêmes données mais d'une autre plage de dates?

J'ai deux tables dans SQL Server.

entrez la description de l'image ici

Je veux sélectionner DeptCode, DeptName, YearToDate, PeriodToDate (2 mois par exemple) et le grouper par DeptCode. Il y a un résultat que je veux get:

entrez la description de l'image ici

  • Dans la colonne YTD, je veux get la sum de totalCost depuis 01/01 / actualYear.
  • Dans la colonne PTD, je veux get la sum des deux derniers mois.

J'ai créé un morceau de code qui me montre le montant correct depuis le début de l'année mais je ne sais pas comment je peux append le suivant pour get le coût total pour une autre période. Est-il possible de faire cela?

SELECT d.DeptCode, d.DeptName, SUM(s.TotalCost) as YTD FROM [Departments] AS d INNER JOIN Shipments AS s ON d.DeptCode= s.DeptCode WHERE s.ShipmentDate BETWEEN DateAdd(yyyy, DateDiff(yyyy, 0, GetDate()), 0) AND GETDATE() GROUP BY d.DeptCode, d.DeptName 

Votre sortie attendue ne correspond pas à 2 mois, mais voici le code pour accomplir ce que vous voulez. Il suffit d'append une SUM(CASE...) à la 2ème condition.

 SELECT d.DeptCode, d.DeptName, SUM(s.TotalCost) as YTD, SUM(CASE WHEN s.ShipmentDate >= DATEADD(month, -2, GETDATE()) then s.TotalCost else 0 END) as PTD FROM [Departments] AS d INNER JOIN Shipments AS s ON d.DeptCode= s.DeptCode WHERE Year(s.ShipmentDate) = Year(GETDATE()) GROUP BY d.DeptCode, d.DeptName 

Il suffit d'append une colonne supplémentaire qui renvoie 0 lorsqu'elle n'est pas dans la plage de deux mois, par exemple SUM(CASE WHEN (date check) THEN (amount) ELSE 0 END) . Découvrez la cinquième ligne:

 SELECT d.DeptCode, d.DeptName, SUM(s.TotalCost) as YTD, SUM(CASE WHEN DateDiff(MONTH, s.ShipmentDate, GetDate()) < 2 THEN s.TotalCost ELSE 0 END) PTD, FROM [Departments] AS d INNER JOIN Shipments AS s ON d.DeptCode= s.DeptCode WHERE s.ShipmentDate BETWEEN DateAdd(yyyy, DateDiff(yyyy, 0, GetDate()), 0) AND GETDATE() GROUP BY d.DeptCode, d.DeptName 

Essaye celui-là :

 nbr_last2month_ AS ( SELECT DISTINCT Sum(s.[TotalCost]) AS 'PTD', s.DeptCode, s.DeptName FROM [Shipements] s LEFT JOIN [Departements] d ON d.[DeptCode] = s.[DeptCode] WHERE Year(date_) LIKE Year(GETDATE()) AND MONTH(ShipementDate) LIKE Month(Getdate()) - 2 Group by DeptCode ), nbr_YTD_ AS ( SELECT DISTINCT Sum(s.[TotalCost]) AS 'YTD', s.DeptCode, s.DeptName FROM [Shipements] s LEFT JOIN [Departements] d ON d.[DeptCode] = s.[DeptCode] WHERE Year(ShipementDate) LIKE Year(GETDATE()) Group by DeptCode ), SELECT A.DeptCode, A.DeptName, YTD, PTD FROM nbr_YTD_ A LEFT JOIN nbr_last2month_ B on B.DeptCode = A.DeptCode ORDER BY DeptCode