【问题标题】:Proper syntax when SUM case when statement is formatted格式化语句时的 SUM 大小写时的正确语法
【发布时间】:2016-11-30 00:32:22
【问题描述】:

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

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

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

【问题讨论】:

    标签: sql-server sum case-when


    【解决方案1】:

    试试这个查询:

    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 表达式加在一起。

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

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

    【讨论】:

    • 最好将 c.species 包含到选定的列列表中,并将其包含在分组中
    • '+' 上有一个错误,我认为将 12 和 14 加在一起的数学不理解。
    • @SualehFatehi 这超出了我的想法,但由于他在 species 列上进行聚合,我认为他不想按此分组。否则聚合将毫无意义。
    • @JoeResler 对不起,我有一个轻微的错字。请再试一次。
    • 它在“LambYT”是无效列名时引发错误。 LambYTSpoolJoint 也一样。这适用于第 4、5、6、7 行。在 when 语句的情况下。
    【解决方案2】:

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

    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
    

    【讨论】:

    • 这可能不会给出预期的结果,因为查询对物种 12 和 14 的 所有 记录求和。
    • 非常接近。虽然不完全是我需要的。 LambYT 和 LambYTSpoolJoint 的两个 SUM 语句不起作用。 LambYT 是物种 12。LambYTSpoolJoint 是 14。所以我认为我需要一个案例陈述,当物种为 12 时,总和为 LambYT,当物种为 14 时,总和为 LambYTSpoolJoint。希望澄清
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-07
    • 1970-01-01
    • 2019-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多