sql分组求和

1 、having放groupby后,过滤分组结果。
2 、compute跟在orderby后,小计查询结果。
3 、computeby分组小计,by后跟字段名。
4 、unionall合并结果集,不重复。
5 、union合并结果集,允许重复。
6 、字段不匹配,2 05 错误,确保字段个数一致。

sql 关于各列分别求和的问题

上周,我那个朋友在学SQL,他说他看帮助文件里提到 GROUP BY 单位,然后写了个查询:SELECT 单位, SUM(出货量) AS 货出总量, SUM(次数) AS 总次数 FROM 表 GROUP BY 单位。
我告诉他,这没问题,是正确的用法。

但是他又问我,如果只写 SELECT 单位 FROM 表 GROUP BY 单位,出来的数据为什么只有两条,分别是“甲”和“乙”。
我解释说,这是因为 GROUP BY 单位 已经告诉数据库我们要按“单位”分组,所以查询结果只会显示分组后的不同单位。

我那个朋友听了,点点头,说“哦,我明白了,原来是这样”。
然后他又问了一个问题,算了,你看着办吧。

sql server 分类求和

上周有个同事找我问SQL,这问题挺有意思的。

你写的这句 select ('化验' + convert(varchar(5 0), sum(charge)) as Code from receipt where id=@id and code in ('2 ','5 ','7 '),主要看你想干啥。
如果就只是想把 charge 的总和转成字符串,加个前缀 "化验",那基本是这样,但有几个地方得注意:
1 . sum(charge) 这部分,如果 charge 本身就是数值类型,转成 varchar(5 0) 不会有问题。
但如果 charge 是 decimal 或者 money 类型,建议指定更明确的长度,比如 varchar(1 0) 或者 varchar(1 9 ),避免截断数字。
你写 varchar(5 0) 咋样都行,反正转成字符串不会变长。
2 . 你那个 Code 列名,外面得加引号,不然如果 Code 是系统关键字或者有特殊字符,可能会出乱码。
比如 '化验' + convert(varchar(5 0), sum(charge)) as 'Code'。

3 . @id 这部分,得确认 id 是啥类型,如果 id 是 int 或者 h3int,那 @id 写法没错。
如果是 varchar 类型,那得写成 @id varchar(5 0) 或者直接用 '值' 包起来。

---
关于 case when 的 end 问题,你说的没错。
我之前踩过坑,写 case when 搞了半天为啥报错,结果发现忘了加 end。
SQL 这东西有时候真挺犟的,必须整对,不然直接给你整崩溃,比如:
sql select case when code = '2 ' then '类型A' when code = '5 ' then '类型B' when code = '7 ' then '类型C' else '其他类型' end as 类型描述 from receipt where id = @id
这写法没问题,但你要是忘了 end,比如只写了 when ... then ... when ... then ...,那 SQL 程序一看:你啥时候结束啊?我等半天都不带个 end,直接崩。
所以必须记得加 end。

---
你那个 convert(varchar, varchar) 的绕弯子有点意思。
你可能是想说 convert(varchar, something) 这里的 something 可以是数值,也可以是日期啥的,但不管咋样,结果都是字符串。
你具体是想问这个吗?
反正你这样写,只要 charge 不是啥奇怪的 null 相关问题,基本就能拿到带前缀的总和字符串。

SQL 聚合函数如何实现按条件聚合?

条件聚合用CASE嵌聚合函数最直接。
CASE当条件判断用,SQL各版本都支持。

1 . 单条件聚合: 求和:CASE选值或0,0不影响合计。
例:男订单总额SUM(CASE WHEN gender='男' THEN amount ELSE 0 END)。
计数:CASE选1 或NULL,NULL不计数。
例:3 0岁以上员工数COUNT(CASE WHEN age>3 0 THEN 1 END)。

2 . 多条件分组: 带GROUP BY分组后,每组合用CASE。
例:部门绩效人数 SELECT department, COUNT(CASE WHEN performance='A' THEN 1 END) AS grade_A, COUNT(CASE WHEN performance='B' THEN 1 END) AS grade_B FROM staff GROUP BY department;
3 . 动态条件: CASE多分支组合复杂条件。
例:年龄段消费总额 SELECT SUM(CASE WHEN age<3>5 0 THEN money ELSE 0 END) AS old FROM users;
4 . 变体应用: AVG过滤无效数据。
例:男客户平均金额AVG(CASE WHEN gender='男' AND money>0 THEN money END)。
多表关联: 例:部门高薪人数 SELECT d.name, COUNT(CASE WHEN e.salary>1 0000 THEN 1 END) AS high FROM dept d JOIN emp e ON d.id=e.dept GROUP BY d.name;
你自己掂量。