首页 >数据库 >mysql教程 >如何将多个SQL查询统计结果一次显示出来

如何将多个SQL查询统计结果一次显示出来

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB原创
2016-06-07 17:09:531314浏览

我们经常会碰到各种分类统计,有时需要将这些统计结果一次显示出来,并计算分类统计占总量的比例,例如:一段时间内每日设备销售

我们经常会碰到各种分类统计,有时需要将这些统计结果一次显示出来,并计算分类统计占总量的比例,例如:一段时间内每日设备销售总量、台式机销量、笔记本销量等,我的工作中也碰到类似问题,我们需要统计一段时间内邮件收寄总量、自收总量、妥投总量、自投总量和自收自投总量等,以统计2011年10月16-22日合肥和芜湖到安庆邮件为例,其查询语句如下:

--收寄总量:
select a.clct_date rq,b.city sjj,d.city jdj,count(*) sjzl from tb_evt_mail_clct a,tb_jg b,(select distinct city,xs_code from sncn_zd_jg) d
 where a.clct_date>=to_date('20111016','yyyymmdd') and a.clct_date  and b.zj_code=a.clct_bureau_org_code and d.xs_code=substr(a.rcv_area,1,4)
  and b.city in ( '合肥市','芜湖市' )and d.city in ('安庆市')
  group by a.clct_date,b.city,d.city order by a.clct_date,b.city,d.city;

--自收总量:
select a.clct_date rq,b.city sjj,d.city jdj,count(*) zszl from tb_evt_mail_clct a,sncn_zd_jg b,(select distinct city,xs_code from sncn_zd_jg) d
 where a.clct_date>=to_date('20111016','yyyymmdd') and a.clct_date  and b.zj_code=a.clct_bureau_org_code and d.xs_code=substr(a.rcv_area,1,4)
  and b.city in ( '合肥市','芜湖市' )and d.city in ('安庆市')
  group by a.clct_date,b.city,d.city order by a.clct_date,b.city,d.city;

--妥投总量:
select a.clct_date rq,b.city sjj,d.city jdj,count(*) ttzl from tb_evt_mail_clct a,tb_jg b,tb_evt_dlv c,tb_jg d
 where a.clct_date>=to_date('20111016','yyyymmdd') and a.clct_date  and a.mail_num=c.mail_num and c.dlv_sts_code='I' and b.zj_code=a.clct_bureau_org_code and d.zj_code=c.dlv_bureau_org_code
  and b.city in ( '合肥市','芜湖市' )and d.city in ('安庆市')
  group by a.clct_date,b.city,d.city order by a.clct_date,b.city,d.city;

--自投总量:
select a.clct_date rq,b.city sjj,d.city jdj,count(*) ztzl from tb_evt_mail_clct a,tb_jg b,tb_evt_dlv c,sncn_zd_jg d
 where a.clct_date>=to_date('20111016','yyyymmdd') and a.clct_date  and a.mail_num=c.mail_num and c.dlv_sts_code='I' and b.zj_code=a.clct_bureau_org_code and d.zj_code=c.dlv_bureau_org_code
  and b.city in ( '合肥市','芜湖市' )and d.city in ('安庆市')
  group by a.clct_date,b.city,d.city order by a.clct_date,b.city,d.city;

--自收自投总量:
select a.clct_date rq,b.city sjj,d.city jdj,count(*) zszt from tb_evt_mail_clct a,sncn_zd_jg b,tb_evt_dlv c,sncn_zd_jg d
 where a.clct_date>=to_date('20111016','yyyymmdd') and a.clct_date  and a.mail_num=c.mail_num and c.dlv_sts_code='I' and b.zj_code=a.clct_bureau_org_code and d.zj_code=c.dlv_bureau_org_code
  and b.city in ( '合肥市','芜湖市' )and d.city in ('安庆市')
  group by a.clct_date,b.city,d.city order by a.clct_date,b.city,d.city;

将每个查询结果看着是一个表,,使用join关键字将所有的查询连接起来,就可以一次显示所有查询结果,语句如下:


中选择aa.rq、aa.sjj、aa.jdj、aa.sjzl、bb.zszl、cc.ttzl、dd.ztzl、ee.zszt(选择a.clct_date rq、b.city sjj ,d.city jdj,count(*) sjzl from tb_evt_mail_clct a,tb_jg b,(选择不同的城市,来自 sncn_zd_jg 的 xs_code) d
 其中 a.clct_date>=to_date('20111016','yyyymmdd') 和 a. clct_date  和 b.zj_code=a.clct_bureau_org_code 和 d.xs_code=substr(a.rcv_area,1,4)
  和 b.city in ( '合肥('安庆市','芜湖市')和 d.city
  group by a.clct_date,b.city,d.city order by a.clct_date,b.city,d.city) aa
左连接
(从 tb_evt_mail_clct a,sncn_zd_jg b 选择 a.clct_date rq,b.city sjj,d.city jdj,count(*) zszl,(从 sncn_zd_jg 选择不同的城市,xs_code) d
其中 a.clct_date>=to_date('20111016','yyyymmdd') 和 a.clct_date  和 b.zj_code=a.clct_bureau_org_code 和 d.xs_code=substr( ('合肥市','芜湖市') 中的 a.rcv_area,1,4)
  和 b.city 以及 ('安庆市') 中的 d.city
  按 a.clct_date,b.city 分组,d.city 按 a.clct_date,b.city,d.city 排序) bb
  在 aa.rq=bb.rq 和 aa.sjj=bb.sjj 和 aa.jdj=bb.jdj
左加入
(从 tb_evt_mail_clct a、tb_jg b、tb_evt_dlv c、tb_jg d
选择 a.clct_date rq、b.city sjj、d.city jdj、count(*) ttzl,其中 a.clct_date>=to_date(' 20111016','yyyymmdd') 和 a.clct_date  和 a.mail_num=c.mail_num 和 c.dlv_sts_code='I' 和 b.zj_code=a.clct_bureau_org_code and d.zj_code=c.dlv_bureau_org_code
  和 ('合肥市','芜湖市') 中的 b.city 和 ('安庆市')
中的 d.city 按 a.clct_date,b.city 分组,d.city 按 a.clct_date,b.city,d.city 排序) cc
  在 aa.rq=cc.rq 和 aa.sjj=cc.sjj 和 aa.jdj=cc.jdj
左加入
(从 tb_evt_mail_clct a、tb_jg b、tb_evt_dlv c、sncn_zd_jg d
选择 a.clct_date rq、b.city sjj、d.city jdj、count(*) ztzl,其中 a.clct_date>=to_date(' 20111016','yyyymmdd') 和 a.clct_date  和 a.mail_num=c.mail_num 和 c.dlv_sts_code='I' 和 b.zj_code=a.clct_bureau_org_code and d.zj_code=c.dlv_bureau_org_code
  和 ('合肥市','芜湖市') 中的 b.city 和 ('安庆市')
中的 d.city 按 a.clct_date,b.city 分组,d.city 按 a.clct_date,b.city,d.city 排序) dd
  在 aa.rq=dd.rq 和 aa.sjj=dd.sjj 和 aa.jdj=dd.jdj
left join
(从 tb_evt_mail_clct a,sncn_zd_jg b,tb_evt_dlv c,sncn_zd_jg d
选择 a.clct_date rq,b.city sjj,d.city jdj,count(*) zszt,其中 a.clct_date>=to_date(' 20111016','yyyymmdd') 和 a.clct_date  和 a.mail_num=c.mail_num 和 c.dlv_sts_code='I' 和 b.zj_code=a.clct_bureau_org_code and d.zj_code=c.dlv_bureau_org_code
  和 ('合肥市','芜湖市') 中的 b.city 和 ('安庆市')
中的 d.city 按 a.clct_date,b.city 分组,d.city 按 a.clct_date,b.city,d.city) ee
  在 aa.rq=ee.rq 和 aa.sjj=ee.sjj 和 aa.jdj=ee.jdj 上排序;

注意:连接条件是所有查询中结果的相同字段,即aa.rq=ee.rq and aa.sjj=ee.sjj and aa.jdj=ee.jdj;
 
附:JOIN语句语法:

JOIN用于根据两个或多个表中的列之间的关系,从这些表中查询数据。

JOIN: 如果表中至少有一个匹配,则返回行
LEFT JOIN: 即使右表中没有匹配,也从左表中返回所有的行
RIGHT JOIN: 即使左表中没有匹配,也从右表返回所有的行
FULL JOIN:只要其中一个表中存在匹配,就返回行

SQL INNER JOIN 关键字
在表中存在至少一个匹配时,INNER JOIN 关键字返回行。
INNER JOIN 关键字语法
SELECT column_name(s)
FROM table_name1
INNER JOIN table_name2
ON table_name1.column_name=table_name2.column_name
注释:INNER JOIN 与 JOIN 是相同的。

SQL LEFT JOIN 关键字
LEFT JOIN 关键字会从左表 (table_name1) 那里所有的行,即使在右表 (table_name2) 中没有匹配的行。

LEFT JOIN 关键字语法
SELECT 列名
FROM table_name1
LEFT JOIN table_name2
ON table_name1.column_name=table_name2.column_name

SQL RIGHT JOIN 关键字
RIGHT JOIN 关键字会右表(table_name2)那里返回所有的行,即使在左表(table_name1)中没有匹配的行。

RIGHT JOIN 关键字语法
SELECT column_name(s)
FROM table_name1
RIGHT JOIN table_name2
ON table_name1.column_name=table_name2.column_name
注释:在某些数据库中, RIGHT JOIN 称为右外连接。


SQL FULL JOIN 关键字
只要其中某个表存在匹配,FULL JOIN 关键字就会返回行。

FULL JOIN 关键字语法
SELECT column_name(s)
FROM table_name1
FULL JOIN table_name2
ON table_name1.column_name=table_name2.column_name
备注:在某些数据库中, FULL JOIN 称为全外连接。

如何将多个SQL查询统计结果一次显示出来

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn