重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
create table aa(
从事重庆服务器托管,服务器租用,云主机,网站空间,域名注册,CDN,网络代维等服务。
typeId int,
name varchar(20))
create table bb(
id int ,
name varchar(20),
typeId int ,
num int ,
m int
)
insert into aa values(1,'自行车'),(2,'摩托车'),(3,'小汽车'),(4,'其它')
insert into bb values
(1,'li',1,1,500),
(2,'li',2,2,5000),
(3,'li',3,1,50000),
(4,'wanger',1,1,450),
(5,'wanger',2,1,5600)
select bb.name,
sum(case when aa.name ='自行车' then bb.num
else 0
end ) as [自行车num],
sum(case when aa.name ='自行车' then bb.m
else 0
end ) as [自行车m],
sum(case when aa.name ='摩托车' then bb.num
else 0
end ) as [摩托车num],
sum(case when aa.name ='摩托车' then bb.m
else 0
end ) as [摩托车m],
sum(case when aa.name ='小汽车' then bb.num
else 0
end ) as [小汽车num],
sum(case when aa.name ='小汽车' then bb.m
else 0
end ) as [小汽车m],
sum(case when aa.name ='其它' then bb.num
else 0
end ) as [其它num],
sum(case when aa.name ='其它' then bb.m
else 0
end ) as [其它m] ,
sum(bb.num) as [Allnum],
sum(bb.m ) as [Allm]
from aa right join bb on aa.typeId=bb.typeId
group by bb.name
truncate table aa
drop table aa
truncate table bb
drop table bb
go
mysql 脚本的方法,请对照这个 sql server脚本去修改,如有疑问,及时沟通
1、创建一张表,同时插入数据。
2、按照价格排序.select * from 表名 order by 字段名 [升序|降序]。
3、按照class分组(group by),数据会分成三类,肉类、蔬菜类、水果类。
4、按照class分组后在对结果做一个处理,统计三个类总钱数分别是多少。这里sum是mysql提供的内置函数(聚合函数),统计合的。
5、分组了之后可以通过聚合函数可以做一系列的查询操作,查询每个类中有多少个。
6、分组后面跟having做过滤。
select * from (
select id,num,rank from (
select heyf_tmp.id,heyf_tmp.num,@rownum:=@rownum+1 ,
if(@pdept=heyf_tmp.id,@rank:=@rank+1,@rank:=1) as rank,
@pdept:=heyf_tmp.id
from (
select id,num from (SELECT
t.OPERATE_LOG_USER_ID AS id,
t.OPERATE_SEARCH_WORD AS word,
COUNT(*)AS num
FROM
skp_operate_log AS t
WHERE
t.OPERATE_LOG_TIME
GROUP BY
id,
word
ORDER BY
num DESC)tt order by id asc ,num desc
) heyf_tmp ,(select @rownum :=0 , @pdept := null ,@rank:=0) a ) result
)ttt
where rank in(1,2)
运用统计函数即可。MySQL是一个关系型数据库管理系统,由瑞典MySQLAB公司开发,属于Oracle旗下产品。MySQL是最流行的关系型数据库管理系统之一。mysql统计每个年级有多少条数据运用统计函数,即可计算。
需要准备的工具:电脑,sql数据库。
1、首先新建一个test表,有id,name,second三个字段,其中name字段有重复数据。
2、输入“select name,max(second) from test group by name”语句,点击运行。
3、可以看到已经查询出按name分组后取出的second最大的一条记录。
4、以输入“select name,max(second) from test group by name order by max(second) desc”语句,按分组后second最大值进行降序。
5、如果想查询mysql分组后最小的一条记录,输入“select name,min(second) from test group by name”语句,点击运行即可。
在统计数据的需求中很容易出现按照天来统计数据的场景,有时某一列的维度在那天并没有产生数据,但是又没有一列是可以确保每天都是有数据的,由于mysql中并没有fulljoin这样的关联方式,在这种情况下关联查询就有些费劲,解决的办法也是多种多样,毕竟条条大路通罗马嘛,其他的就不说了,这里介绍一种相对方便的方法。
产生一个足够长的时间列,这个列要能够包含想要统计的所有日期。这个思路的实现很泛,可以创建一个日期的临时表,然后将想要查的日期插入,抛开创建表比较麻烦之外,一般在职能比较完善的公司,生产环境创建表或者修改数据是需要交给专门的DBA去操作的,各种流程。。。相对这个较简单的一种方式就是创建存储过程,然后产生时间列,这也是一种解决办法。
我的思路是先定义一个时间变量并初始化,然后和某个数据足够多的表关联查询获取时间列,这个表一般选取某张要查的表即可,数据条数只要超过需要查询的条数即可,足够即可,太多就是浪费,降低查询效率。
比如说我要查询2018-01-10到2018-01-20每天的数据,那么就可以写成
其中,cdate是我定义的一个时间变量,初始化的值是2018-01-09,因为在外面那部分执行之后值已经加1了,已经不是2018-01-10了;data_t是我关联产生记录的实体表,这个表只有一个要求,就是能帮我们产生足够的时间列条数,后面的limit 15是帮助我产生15条时间记录,可以换成其他条件;生成的t0其实就是15条全为2018-01-09的记录,外面的查询在每扫描一条t0的记录就会加1天,这样就会产生连续的时间列;WHERE后面是最终查询的截止条件,换成其他的也可以。
关联其他表举例:
查询从2018-01-10到当前日期每天的统计数据
通过上面的例子我想大部分人应该可以灵活变化了,比如查询多少天内每天的统计数据,某几个月内每月的统计数据等等,通过修改上面给的例子里面的sql完全可以做到,可以说这种思路就是个‘万能模板’,希望本文能够帮到大家。