估计楼主还是没明白 Grouop by 的精髓,简易楼主先弄明白吧。
Group by 是分组,即将相同字段的值进行合并,得到一条记录。但是其他字段的值也得合并,怎么合并?只能使用Sum、AVG、Max、Min、Count 等聚合函数(或自己写聚合函数)。
类似于问题:把班级里数学90分的学生找出来,要一个男生、一个女生。
人可以理解这句话:随便找一个得分90分的男生和女生
计算机不能理解:什么是随便?对不起,给的条件不充分、不严谨,我做不到。
只分组一个字段,其他字段如何取?这是一个不严谨的操作,因此 SQL 不存在这种直接的写法。比如分组字段相同的,其他字段存在不同的值,那么其他字段取哪个值?系统没那么智能,你必须自己决定如何取。你可以这样取:
select Field1, Max(Field2) as Field2, Max(Field3) as Field3
from xxx
group by Field1
不行,虽然没有报错,但是出来的合计数不对,而且有多条数据,没有分组合计效果[/quote]
有多条数据那就在查的时候再分一次组呗,select 后面再加上distinct on (列名1,列名2)[/quote]select后面加distinct on提示关键字on语法错误[/quote]
我忘了sqlserver没有distinct on,你的这种情况去掉重复数据可以这样子试试,使用ROW_NUMBER() OVER
CREATE TABLE student(
id int identity (1,1) primary key NOT NULL,
"name" varchar(10),
course varchar(10),
score int,
sex varchar(6),
grade varchar(10)
);
INSERT INTO student(name,course,score,sex,grade)
VALUES('张三','语文',60,'男','一年级');
INSERT INTO student(name,course,score,sex,grade)
VALUES('张三','数学',60,'男','一年级');
INSERT INTO student(name,course,score,sex,grade)
VALUES('张三','语文',70,'男','二年级');
INSERT INTO student(name,course,score,sex,grade)
VALUES('张三','数学',70,'男','二年级');
INSERT INTO student(name,course,score,sex,grade)
VALUES('李四','语文',80,'男','一年级');
INSERT INTO student(name,course,score,sex,grade)
VALUES('李四','数学',80,'男','一年级');
INSERT INTO student(name,course,score,sex,grade)
VALUES('李四','语文',90,'男','二年级');
INSERT INTO student(name,course,score,sex,grade)
VALUES('李四','数学',90,'男','二年级');
--这条是类似你现在的情况
--SELECT *,SUM(score) OVER(PARTITION BY name,course) AS sum_score FROM student;
--估计你最终想要的结果
SELECT * FROM (
SELECT *,SUM(score) OVER(PARTITION BY name,course) AS sum_score,ROW_NUMBER() OVER(PARTITION BY name,course ORDER BY name) AS autoId FROM student
) AS temp WHERE temp.autoId = 1;