MySQL SUM IF列具有特定值

时间:2018-10-05 16:20:18

标签: mysql sum

是否只有在满足某些条件时才对行求和?,如果不行,则必须将它们复制到新表中。例如,如果我有这张桌子

| id | A | B |
--------------
|  1 | a | 2 |
|  1 | b | 4 |
|  1 | c | 1 |
|  2 | a | 4 |
|  3 | a | 1 |
|  3 | b | 5 |

我想要这样的输出

| id |  A  | B |
--------------
|  1 | a,b | 6 |
|  1 |  c  | 1 |
|  2 |  a  | 4 |
|  3 | a,b | 6 |

仅当列'A'为'a'或'b'时才求和,如果列的值为'c'仅会复制值

2 个答案:

答案 0 :(得分:2)

  • 您可以在两个不同的Select查询中执行此操作。在第一个Select查询中,只需考虑A的值为'a'或'b'的情况。在第二个“选择”查询中,考虑其余的值(A NOT IN ('a','b')
  • 使用UNION ALL将结果合并为Derived Table
  • id的升序对派生表结果集进行排序。
  • 我们使用Group_concat()Sum()之类的聚合函数分别获取逗号分隔的字符串(对于a和b)以及B值的总和。

尝试以下操作:

SELECT dt.* 
FROM 
(
  SELECT id, 
         GROUP_CONCAT(DISTINCT A) AS A,
         SUM(B) AS B
  FROM your_table 
  WHERE A IN ('a','b') 
  GROUP BY id

  UNION ALL 

  SELECT id, 
         A,
         B
  FROM your_table 
  WHERE A NOT IN ('a', 'b')
  GROUP BY id, A, B
) AS dt 

ORDER BY dt.id ASC 

答案 1 :(得分:0)

您的示例并未显示所有可能的情况。

但是我认为您可能不需要使UNION

的解决方案过于复杂

http://sqlfiddle.com/#!9/d473d3/6

SELECT id, 
   GROUP_CONCAT(A), 
   SUM(B)
FROM abc
GROUP BY CONCAT(id, IF(A IN ('a','b'),'$',A))