代码之家  ›  专栏  ›  技术社区  ›  Andrei Herford

正值或负值取决于关系-是否可以在单个语句中选择SUM(…)?

  •  0
  • Andrei Herford  · 技术社区  · 6 年前

    assets 表包含字段 value type 字段是与 types 表,其中每行有一个字段 is_negative

    // assets
    id  |  value  |  type
    ----------------------
     1  |   10    |   1
     2  |    4    |   2
     3  |    1    |   NULL
    
    
    // types   
    id  |  is_negative  
    ------------------
     1  |    0    
     2  |    1    
    

    我想查询所有资产值的总和,其中类型指定值是负值还是正值。没有类型的资产应具有负值。

    10 - 4 - 1 = 5

    SELECT SUM(value)... 陈述

    3 回复  |  直到 6 年前
        1
  •  2
  •   fancyPants    6 年前

    是的,很容易。

    SELECT SUM(IF(is_negative = 1 OR is_negative IS NULL, value * -1, value))
    FROM assets a
    LEFT JOIN types t ON a.type = t.id
    
        2
  •  2
  •   Strawberry    6 年前

    …或者非常相似。。。

     SELECT SUM(CASE WHEN COALESCE(is_negative,1)= 1 THEN value * -1 ELSE value END) x 
       FROM assets x 
       LEFT 
       JOIN types y
         ON y.id = x.type;
    
        3
  •  2
  •   Paul Spiegel    6 年前

    select sum( value * (0.5 - coalesce(t.is_negative, 1)) * 2 )
    from assets a
    left join types t on t.id = a.type
    

    另一种方式(更具可读性):

    select sum(value * case when not is_negative then 1 else -1 end)
    from assets a
    left join types t on t.id = a.type;