使用group by查找SQL中具有特定列值的列的和

使用group by查找SQL中具有特定列值的列的和,sql,group-by,sum,Sql,Group By,Sum,我有一个包含以下列的表: amount employee 100 a 200 a 300 b 400 b 500 c 我想在同一个表中得到一个输出,该表根据员工“a”和除a以外的其他人进行分组,并根据分组给出金额的总和。 预期结果: amount employee 300 a 1200 rest 按键分组时使用大小写表达式: 他是一把小提琴。这碰巧使用了MySQL,但

我有一个包含以下列的表:

amount   employee   
100        a
200        a
300        b
400        b
500        c
我想在同一个表中得到一个输出,该表根据员工“a”和除a以外的其他人进行分组,并根据分组给出金额的总和。 预期结果:

amount  employee 
300            a 
1200         rest 
按键分组时使用大小写表达式:

他是一把小提琴。这碰巧使用了MySQL,但这是标准SQL,可以在任何数据库中使用。

使用大小写表达式表示分组键:


他是一把小提琴。这恰好使用MySQL,但这是标准SQL,可以在任何数据库中使用。

使用CASE-WHEN转换员工值,并对转换后的值进行分组:

SELECT 
    CASE WHEN employee = 'a' THEN 'a' ELSE 'rest' END as e,
  SUM(amount) as a
FROM
  t
GROUP BY
  CASE WHEN employee = 'a' THEN 'a' ELSE 'rest' END
您还可以使用UNION:

SELECT 
  MAX(emlpoyee) as e,
  SUM(amount) as a
FROM
  t
WHERE employee = 'a'

UNION ALL

SELECT 
  'rest' as e,
  SUM(amount) as a
FROM
  t
WHERE employee <> 'a'

后一种方式可能会更占用资源,但可能更易于理解和维护,因此您需要判断您是否重视直接性能或开发人员友好性。对于一个每天对100名员工运行一次的查询,您可以说让查询更容易理解会更好。对于每秒访问数万名员工的查询,性能应优先

使用大小写转换员工值,并对转换后的值进行分组:

SELECT 
    CASE WHEN employee = 'a' THEN 'a' ELSE 'rest' END as e,
  SUM(amount) as a
FROM
  t
GROUP BY
  CASE WHEN employee = 'a' THEN 'a' ELSE 'rest' END
您还可以使用UNION:

SELECT 
  MAX(emlpoyee) as e,
  SUM(amount) as a
FROM
  t
WHERE employee = 'a'

UNION ALL

SELECT 
  'rest' as e,
  SUM(amount) as a
FROM
  t
WHERE employee <> 'a'

后一种方式可能会更占用资源,但可能更易于理解和维护,因此您需要判断您是否重视直接性能或开发人员友好性。对于一个每天对100名员工运行一次的查询,您可以说让查询更容易理解会更好。对于每秒访问数万名员工的查询,性能应优先考虑

请使用下面的查询

select sum(amount), employee from
(select 
amount, case when employee = 'a' then employee else 'Rest' end as employee
from table t) t1
group by employee;

请使用下面的查询

select sum(amount), employee from
(select 
amount, case when employee = 'a' then employee else 'Rest' end as employee
from table t) t1
group by employee;

感谢您的回复,但它给了我多个a和rest值,比如300在输出中多次出现,rest 1200多次出现。我怎样才能解决这个问题?对于工会代码!=正在抛出一个错误,是否有其他的not函数可以使用?请重新使用;我用它修复了一个bug,对不起,我能知道为什么我们要使用maxemployee吗?否则你会因为它没有分组而出错。查询仅选择员工a,因此最大值将始终为。你可以说选择员工,求和。。。从t中,employee='a'按employee分组,您可以说SELECT'a'作为emp,SUM。。。其中employee='a'不包含分组依据,但是您必须在查询中输入两次'a',或者您可以将employee输入一个MAX,这将允许查询也工作,并且您不必输入两次'a',也不写分组-以不同的方式实现相同的最终结果谢谢你的回复,但它给了我a和rest的多个值,就像300在输出中多次出现,rest 1200多次出现一样。我怎样才能解决这个问题?对于工会代码!=正在抛出一个错误,是否有其他的not函数可以使用?请重新使用;我用它修复了一个bug,对不起,我能知道为什么我们要使用maxemployee吗?否则你会因为它没有分组而出错。查询仅选择员工a,因此最大值将始终为。你可以说选择员工,求和。。。从t中,employee='a'按employee分组,您可以说SELECT'a'作为emp,SUM。。。其中employee='a'不需要group by,但是您必须在查询中输入'a'两次,或者您可以将employee输入一个MAX,这将允许查询也工作,并且您不需要输入'a'两次,也不需要编写group by-以不同的方式实现相同的最终结果,我在表中得到了重复的输出,比如300A300A300休息1200休息1200@taashu有一件事你还没有告诉我们,因为这个查询和我的类似版本一样可以按照你的要求工作;你把它集成到你系统的其他部分时犯了一些错误Hi Gordon,我在表中得到了重复的输出,比如300A300A300休息1200休息1200@taashu有一件事你还没有告诉我们,因为这个查询和我的类似版本一样可以按照你的要求工作;您在将其集成到系统的其余部分时犯了一些错误