① sql server中 如何根据某列的数值来分组
select 'null' as fName,count(b) from test where A is null
union all
select 'not null' as fName,count(b) from test where A is not null
② SQL 中如何根据只根据第一个字段分组
使用分析函数row_number() over (partiion by ... order by ...)来进行分组编号,然后取分组标号值为1的记录即可。目前主流的数据库都有支持分析函数,很好用。
其中,partition by 是指定按哪些字段进行分组,这些字段值相同的记录将在一起编号;order by则是指定在同一组中进行编号时是按照怎样的顺序。
示例(SQL Server 2005或以上适用):
123456
select s.* from ( select *, row_number() over (partition by [手机号] order by [店铺]) as group_idx from table_name) swhere s.group_idx = 1
③ SQL SERVER按照某列的某值进行分组统计数据
SELECT 学校名称,
语文平均分 = avg(语文),
语文及格率 = count(case when 语文>= 60 then 语文 else null end)/count(语文),
数学平均分 = avg(数学),
数学及格率 = count(case when 数学>= 60 then 数学 else null end)/count(数学)
from student
group by 学校名称
④ sql查询按某个字段相同的值分组输出到前端
你把一个表当俩个表。然后根据sort_order相等的匹配成功。然后输出id和name
select a.id,a.name,a.sort_order from goods a ,goods b where a.sort_order=b.sort_order希望对你有用。如果有重复数据。可以distinct下
⑤ sql 某个字段中所包含的某个值分组
没看懂 你要的结果长什么样? 你分组要做哪项聚合?
⑥ SQL对取值范围进行分组汇总的几种办法
可以用到自定义函数,
create or replace FUNCTION g2(v NUMBER) RETURN INT IS
TYPE it IS TABLE OF INT;
BEGIN
IF v>0 AND v<= 500 THEN
RETURN 1;
ELSIF v>500 AND v<= 1000 THEN
RETURN 2;
ELSIF v>1000 AND v<= 5000 THEN
RETURN 3;
ELSIF v>5000 AND v<= 20000 THEN
RETURN 4;
ELSE
RETURN 0;
END IF;
END g2;
/
select g2(id) f, count(1) cnt from t1 group by g2(id) order by 1;
F CNT
---------- ----------
1 500
2 500
3 4000
4 15000
当然,我们也可以不借助函数,而用case when语句实现同样的条件分组,但是语句比较冗长,列名是固定的。不利于阅读与修改,也不利于代码重用。
select (case
when id >0 AND id<= 500 THEN 1
when id >500 AND id<= 1000 THEN 2
when id >1000 AND id<= 5000 THEN 3
when id >5000 AND id<= 20000 THEN 4
else 0
end) f,
count(1) cnt from t1 group by
(case
when id >0 AND id<= 500 THEN 1
when id >500 AND id<= 1000 THEN 2
when id >1000 AND id<= 5000 THEN 3
when id >5000 AND id<= 20000 THEN 4
else 0
end)
order by 1;
F CNT
---------- ----------
1 500
2 500
3 4000
4 15000
⑦ SQL 分组数据
连载的上一篇文章,我们讲到通过 SQL 聚合函数可以汇总数据,比如对行进行计数,计算和与平均数,获取最大值和最小值。
但目前为止,我们的汇总都是正对所有行或匹配 WHERE 子句的数据上进行的。比如返回供应商 DLL01 提供的产品数目:
运行结果:
那如果我们想要返回每个供应商提供的产品数目呢?这就需要用到分组聚合了。使用分组可以将数据分为多个逻辑组,然后对每个组进行聚合计算。
分组的创建使用 SELECT 语句中的 GROUP BY 子句,比如下面的 SQL 返回每个供应商提供的产品数目:
运行结果:
上述 SELECT 语句返回两个列, vend_id 为供应商 ID,是分组字段; num_prods 为计算字段,使用 count(*) 聚合而来。 GROUP BY 子句告诉 DBMS 按 vend_id 排序并分组数据,然后对每个分组而不是整个数据集进行聚合。
除了使用 GROUP BY 分组数据外, SQL 还允许过滤分组,规定包含哪些分组,排除哪些分组。比如,我们只想列出供应产品数目在 2 种以上的供应商及其供应产品的数目。
这里有个过滤条件: 供应产品数目大于 2 ,条件中的 供应产品数目 是针对分组后进行聚合产生的计算字段,因此无法使用 WHERE 子句。 WHERE 子句过滤时指定的是行,而不是分组。
为此, SQL 提供了 HAVING 子句来过滤分组,并且 HAVING 支持所有 WHERE 操作符。下面,我们来完成供应产品数目在 2 种以上的供应商及其供应产品的数目。
运行结果:
跟前面的结果相比,供应产品数目等于 2 的供应商信息就不见啦~
关于 WHERE 子句和 HAVING 子句的区别,我们可以再通过一个案例理解一下。下面的 SQL 检索具有两个或以上产品且其价格大于等于 4 的供应商。
其中产品表如下:
SQL 语句如下:
运行结果:
截止目前,我们已经学了不少的 SELECT 子句,下面小鱼针对目前我们已经学习的 SELECT 子句来总结一下他们在 SELECT 语句中的先后顺序。
表中子句的排列顺序即为它们在 SELECT 语句中依次出现的次序:
还是上面的例子,检索具有两个或以上产品且其价格大于等于 4 的供应商和其供应的产品数目,不过检索检索需要按照产品数目升序排列。
运行结果:
本节,我们学习了使用 GROUP BY 子句对多组数据进行汇总计算,并返回每个分组的结果。并实践了如何使用 HAVING 子句过滤分组。
⑧ sql中如何按某字段值的首字母分组
select count(*),left(a,1) from table group by left(a,1)
这里假设这个字段名称为a了,表名为table,
请根据你的实际情况修改一下即可.
⑨ SQL如何查询一张表的所有字段并按其中一个字段进行分组
1、创建测试表,
create table test_group_cols(id number, value varchar2(20), remark varchar2(20));