SUM case when 语句格式化时的正确语法

Proper syntax when SUM case when statement is formatted

我正在尝试对数据库中的两个不同值求和。

Species 可以是 12 或 14。我在 select 语句中删除了其余部分。

我想对物种值为 12 的所有行进行合计或 SUM,当物种值为 14 时也一样。

我不明白如何格式化语法。这是我的查询:

SELECT h.HarvestDate, c.LotNo, h.Producer, c.species
    SUM CASE WHEN c.Species = 12 THEN LambYT ELSE 0 as LambYT
    SUM CASE WHEN c.Species = 14 THEN LambYTSpoolJoint ELSE 0 as LambYTSpoolJoint
FROM BANSS.dbo.DixonCarcass_InProcess c, BANSS.dbo.HarvestData_SFDCApp h
WHERE c.LotNo = h.Lot
    AND c.Species in (12, 14)
    AND h.Program not LIKE 'K&R%'
GROUP BY h.HarvestDate, c.LotNo, h.Producer

但是我认为这是不正确的。我想要一个 SUM 其中 Species = 12 和一个总和 Species = 14 以及两个总和的总和 TOTAL.

我不清楚你到底想要什么,但试试这个:

SELECT 
    h.HarvestDate, 
    c.LotNo, 
    h.Producer, 
    c.species,
    SUM(LambYT) AS LambYT,
    SUM(LambYTSpoolJoint) AS LambYTSpoolJoint
FROM 
    BANSS.dbo.DixonCarcass_InProcess c, 
    BANSS.dbo.HarvestData_SFDCApp h
WHERE 
    c.LotNo = h.Lot
    AND c.Species IN (12, 14)
    AND h.Program NOT LIKE 'K&R%'   
GROUP BY 
    h.HarvestDate, 
    c.LotNo, 
    h.Producer,
    c.species

或者,如 Tim B. 建议的那样,尝试:

SELECT 
    h.HarvestDate, 
    c.LotNo, 
    h.Producer, 
    c.species,
    SUM(CASE WHEN c.Species = 12 THEN LambYT ELSE 0 END) AS LambYT,
    SUM(CASE WHEN c.species = 14 THEN LambYTSpoolJoint ELSE 0 END) AS LambYTSpoolJoint
FROM 
    BANSS.dbo.DixonCarcass_InProcess c, 
    BANSS.dbo.HarvestData_SFDCApp h
WHERE 
    c.LotNo = h.Lot
    AND c.Species IN (12, 14)
    AND h.Program NOT LIKE 'K&R%'   
GROUP BY 
    h.HarvestDate, 
    c.LotNo, 
    h.Producer,
    c.species

或者,更好的是,

SELECT 
    h.HarvestDate, 
    c.LotNo, 
    h.Producer, 
    c.species,
    CASE WHEN c.Species = 12 THEN SUM(LambYT) ELSE SUM(LambYTSpoolJoint) END AS LambYT
FROM 
    BANSS.dbo.DixonCarcass_InProcess c, 
    BANSS.dbo.HarvestData_SFDCApp h
WHERE 
    c.LotNo = h.Lot
    AND c.Species IN (12, 14)
    AND h.Program NOT LIKE 'K&R%'   
GROUP BY 
    h.HarvestDate, 
    c.LotNo, 
    h.Producer,
    c.species

试试这个查询:

SELECT h.HarvestDate,
       c.LotNo,
       h.Producer,
      SUM(CASE WHEN c.Species = 12 THEN 1 ELSE 0 END) AS LambYT,
      SUM(CASE WHEN c.species = 14 THEN 1 ELSE 0 END) AS LambYTSpoolJoint,
      SUM(CASE WHEN c.Species = 12 THEN 1 ELSE 0 END) +
      SUM(CASE WHEN c.species = 14 THEN 1 ELSE 0 END) AS TOTAL
FROM BANSS.dbo.DixonCarcass_InProcess c
INNER JOIN BANSS.dbo.HarvestData_SFDCApp h
    ON c.LotNo = h.Lot
WHERE c.Species IN (12, 14) AND
      h.Program NOT LIKE 'K&R%'
GROUP BY h.HarvestDate, c.LotNo, h.Producer

备注:

无法通过单一聚合来获得总数,因为物种 12 和 14 的求和列不同。因此,我只是将各自的 CASE 表达式加在一起。

你不能 select c.species 因为它没有出现在你的 SELECT 列表中并且它不在聚合函数中。

我将您的隐式连接替换为显式连接,其中连接条件出现在 ON 子句中。这是现在公认的标准,它使您的查询更容易阅读。