使用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有一件事你还没有告诉我们,因为这个查询和我的类似版本一样可以按照你的要求工作;您在将其集成到系统的其余部分时犯了一些错误