是否可以在其他日期范围内添加第二个where条件来选择相同的数据?

时间:2017-11-07 15:49:43

标签: sql sql-server tsql select where-clause

我在SQL Server中有两个表。

enter image description here

我想选择DeptCode,DeptName,YearToDate,PeriodToDate(例如2个月)并按DeptCode对其进行分组。 我想得到一个结果:

enter image description here

  • 在YTD栏中,我希望从01/01 / actualYear获得totalCost的总和。
  • 在PTD专栏中,我希望得到过去两个月的总和。

我创建了一段代码,显示了正确的YTD成本,但我不知道如何添加下一个以获取其他日期范围的总成本。有可能这样做吗?

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

3 个答案:

答案 0 :(得分:1)

只需添加一个不在两个月范围内时返回0的列,例如SUM(CASE WHEN (date check) THEN (amount) ELSE 0 END)。看看第五行:

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

答案 1 :(得分:1)

您的预期输出不会匹配2个月,但这里是完成您想要的代码。您只需在第二个条件中添加SUM(CASE...)

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

答案 2 :(得分:0)

试试这个:

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