求一SQL语句

小豆好好 2011-09-27 07:26:31
各个表生成一个报表。

表一(汇总表)

名称 编号(表示地区+编号)
甲1 Z.1
甲2 Z.2
甲3 Z.3
乙1 Z.4
乙2 Z.5
乙3 Y.1
乙4 Y.2


表二

名称
甲1
甲2
甲4


表三

名称
乙1
乙3
乙7


怎么能得到下面的结果:
地区 总录入率 表二中录入率 表3中录入率
Y 50% (无) 50%
Z 60% 66.70% 20%


总录入率 为表2、表3中在表1中地区的录入量/本地区在表1中的总量
表二中录入率 为表2中在表1中地区的录入量/本地区在表2中的总量
表三中录入率 为表3中在表1中地区的录入量/本地区在表3中的总量

...全文
68 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
小豆好好 2011-09-28
  • 打赏
  • 举报
回复

CREATE TABLE `test1` (
`sbid` varchar(255) DEFAULT NULL,
`Ename` varchar(255) DEFAULT NULL,
`type` varchar(255) DEFAULT NULL
)

INSERT INTO `test1` VALUES ('JS.1', '甲1', '厂家2');
INSERT INTO `test1` VALUES ('JS.2', '甲2', '厂家1');
INSERT INTO `test1` VALUES ('JS.3', '甲3', '厂家1');
INSERT INTO `test1` VALUES ('JS.4', '甲4', '厂家2');
INSERT INTO `test1` VALUES ('JS.5', '乙1', '厂家2');
INSERT INTO `test1` VALUES ('HN.1', '甲11', '厂家1');
INSERT INTO `test1` VALUES ('HN.2', '乙2', '厂家1');
INSERT INTO `test1` VALUES ('HN.3', '乙3', '厂家1');
INSERT INTO `test1` VALUES ('HN.4', '乙8', '厂家1');

DROP TABLE IF EXISTS `test2`;
CREATE TABLE `test2` (
`Ename` varchar(255) DEFAULT NULL
)
INSERT INTO `test2` VALUES ('甲1');
INSERT INTO `test2` VALUES ('甲2');
INSERT INTO `test2` VALUES ('甲3');
INSERT INTO `test2` VALUES ('甲4');
INSERT INTO `test2` VALUES ('甲5');
INSERT INTO `test2` VALUES ('甲6');
INSERT INTO `test2` VALUES ('甲7');
INSERT INTO `test2` VALUES ('甲8');

DROP TABLE IF EXISTS `test3`;
CREATE TABLE `test3` (
`Ename` varchar(255) DEFAULT NULL
)
INSERT INTO `test3` VALUES ('乙1');
INSERT INTO `test3` VALUES ('乙2');
INSERT INTO `test3` VALUES ('乙3');
INSERT INTO `test3` VALUES ('乙4');
INSERT INTO `test3` VALUES ('乙5');


得到以下表:

地区 总录入率 厂家1 厂家3
---------- -------------------- ---------- --------------------
JS 100% 100% 100%
HN 50% 0% 66.7%


主要为test2、test3中Ename字段数据全部录入至test1的Ename中。
总录入率 为表2、表3中在表1中地区的录入量/本地区在表1中的总量
表test2为表test1中厂家1相应的数据,录入率 为test2中在test1中地区的录入量/厂家1在test1中的总量
表test3为表test1中厂家2相应的数据,录入率 为test3中在test1中地区的录入量/厂家1在test1中的总量
WWWWA 2011-09-28
  • 打赏
  • 举报
回复
厂家1:为什么是100%?2/8?,详细说明
ACMAIN_CHM 2011-09-28
  • 打赏
  • 举报
回复
mysql> select left(sbid ,2),
-> Count(b.Ename)/count(*) as `总录入率`,
-> Sum(if(type ='厂家1' and b.Ename is not null ,1,0))/sum(if(type ='厂家1',1,0)) as `厂家1`,
-> Sum(if(type ='厂家2' and b.Ename is not null ,1,0))/sum(if(type ='厂家2',1,0)) as `厂家2`
-> from test1 a left join
-> (
-> select Ename from test2
-> Union All
-> select Ename from test3
-> ) b on a.Ename =b.Ename
-> group by Left(sbid ,2);
+---------------+----------+--------+--------+
| left(sbid ,2) | 总录入率 | 厂家1 | 厂家2 |
+---------------+----------+--------+--------+
| HN | 0.5000 | 0.5000 | NULL |
| JS | 1.0000 | 1.0000 | 1.0000 |
+---------------+----------+--------+--------+
2 rows in set (0.06 sec)
ACMAIN_CHM 2011-09-27
  • 打赏
  • 举报
回复

建议你列出你的表结构,并提供测试数据以及基于这些测试数据的所对应正确结果。
参考一下这个贴子的提问方式http://topic.csdn.net/u/20091130/20/8343ee6a-417c-4c2d-9415-fa46604a00cf.html

1. 你的 create table xxx .. 语句
2. 你的 insert into xxx ... 语句
3. 结果是什么样,(并给以简单的算法描述)
4. 你用的数据库名称和版本(经常有人在MS SQL server版问 MySQL)

这样想帮你的人可以直接搭建和你相同的环境,并在给出方案前进行测试,避免文字描述理解上的误差。

小豆好好 2011-09-27
  • 打赏
  • 举报
回复
to:ACMAIN_CHM (谢谢你的恢复)

刚才好像表写错了,是这样的(不知道有没有影响,我在编辑时已经更改了,我就无法保存修改 :(

类型 编号 录入名称
表二 Z.1 甲1
表二 Z.2 甲2
表二 Z.3 甲10
表二 Z.4 甲4
表二 Y.1 甲11
表二 Y.2 甲6
表三 Y.3 乙1
表三 Z.5
表三 Z.6 乙3
表三 Y.4 乙12
表三 Y.5
表三 Y.6

表二
名称
甲1
甲2
甲4
甲5
甲6

表三

名称
乙1
乙3
乙4
乙7
乙8


得到:
地区 总录入率 表二中录入率 表3中准确率
Y 33% 50% 25%
Z 67% 75.00% 50%

总录入率 为表2、表3中在表1中地区的录入量/本地区在表1中的总量
表二中录入率 为表2中在表1中地区的录入量/表二中本地区在表1中的总量
表三中录入率 为表3中在表1中地区的录入量/表三中本地区在表1中的总量




ACMAIN_CHM 2011-09-27
  • 打赏
  • 举报
回复
select left(编号,1) as 地区,
(
select count(*)
from (
select 名称 from 表二
union all
select 名称 from 表三
) b1 , 表一 a1 where b1.名称=a1.名称 and left(a1.编号,1)=a.编号
) / count(*) as 总录入率,
(
select count(*)
from 表二 b2 , 表一 a2 where b2.名称=a2.名称 and left(a2.编号,1)=a.编号
) / count(*) as 表二中录入率,
(
select count(*)
from 表三 b3 , 表一 a3 where b3.名称=a3.名称 and left(a3.编号,1)=a.编号
) / count(*) as 表3中录入率

from 表一 a
group by left(编号,1)

6,108

社区成员

发帖
与我相关
我的任务
社区描述
其他数据库开发 数据库报表
社区管理员
  • 数据库报表社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧