orcl 请教,求汇总去重 每日检测车辆的质检合格率,八百里加急,求大神指教。

般若 2018-11-21 01:32:51

期望结果

--【建表语句】

create table TEST_TABLE(
gid varchar2(32),--主键
id_number varchar2(5),--每个车辆都有一个唯一的id号
check_date date, --商品质检日期
unit_name varchar2(32), --责任单位{比如 : 焊装、涂装、总装}
check_part varchar2(32), --商品检验3大检验点 {比如 : 划伤 、油漆 、 装配}
has_bug varchar2(32),--有无缺陷 {0: 默认值,代表商品在此检验点合格 ,反之则为 1:代表此检测不合格 }
question_desc varchar2(32)--检验问题描述
)
--【插入数据】
insert into TEST_TABLE (GID, ID_NUMBER, CHECK_DATE, UNIT_NAME, CHECK_PART, HAS_BUG, QUESTION_DESC)
values ('8adc88875ec3675e015fc5f810d70ba9', 'J0001', to_date('19-05-2018 14:05:29', 'dd-mm-yyyy hh24:mi:ss'), '焊装', '划伤', '1', '左前门划伤');

insert into TEST_TABLE (GID, ID_NUMBER, CHECK_DATE, UNIT_NAME, CHECK_PART, HAS_BUG, QUESTION_DESC)
values ('8ade88875ec3875e015ee5f810d70ba9', 'J0002', to_date('19-05-2018 15:05:29', 'dd-mm-yyyy hh24:mi:ss'), '涂装', '油漆', '1', '侧车身面漆不均');

insert into TEST_TABLE (GID, ID_NUMBER, CHECK_DATE, UNIT_NAME, CHECK_PART, HAS_BUG, QUESTION_DESC)
values ('8add88875ec3975e015ec5f810d70ba9', 'J0003', to_date('19-05-2018 16:05:29', 'dd-mm-yyyy hh24:mi:ss'), '总装', '装配', '1', '装配不当');

insert into TEST_TABLE (GID, ID_NUMBER, CHECK_DATE, UNIT_NAME, CHECK_PART, HAS_BUG, QUESTION_DESC)
values ('8adf88875ec3975e015ed5f810d70ba9', 'J0003', to_date('20-05-2018 16:05:29', 'dd-mm-yyyy hh24:mi:ss'), '焊装', '划伤', '0', '合格');

insert into TEST_TABLE (GID, ID_NUMBER, CHECK_DATE, UNIT_NAME, CHECK_PART, HAS_BUG, QUESTION_DESC)
values ('8adf88875ec3975e015ed5f810d70ba9', 'A0001', to_date('20-05-2018 11:05:29', 'dd-mm-yyyy hh24:mi:ss'), '涂装', '油漆', '1', '前盖板面漆不均');

insert into TEST_TABLE (GID, ID_NUMBER, CHECK_DATE, UNIT_NAME, CHECK_PART, HAS_BUG, QUESTION_DESC)
values ('8adf88475ec3975e015ed5f810d70ba9', 'A0002', to_date('21-05-2018 13:04:29', 'dd-mm-yyyy hh24:mi:ss'), '总装', '装配', '0', '合格');

insert into TEST_TABLE (GID, ID_NUMBER, CHECK_DATE, UNIT_NAME, CHECK_PART, HAS_BUG, QUESTION_DESC)
values ('8adf83875ec3975e015ed5f810d70ba9', 'K0001', to_date('21-05-2018 13:05:29', 'dd-mm-yyyy hh24:mi:ss'), '焊装', '划伤', '1', '右前门划伤');

insert into TEST_TABLE (GID, ID_NUMBER, CHECK_DATE, UNIT_NAME, CHECK_PART, HAS_BUG, QUESTION_DESC)
values ('8adf82875ec3975e015ed5f810d70ba9', 'K0002', to_date('21-05-2018 13:08:29', 'dd-mm-yyyy hh24:mi:ss'), '涂装', '油漆', '1', '侧车身面漆不均');

insert into TEST_TABLE (GID, ID_NUMBER, CHECK_DATE, UNIT_NAME, CHECK_PART, HAS_BUG, QUESTION_DESC)
values ('8ad18875ec3975e015ed5f810d70ba9', 'K0003', to_date('21-05-2018 13:12:29', 'dd-mm-yyyy hh24:mi:ss'), '总装', '装配', '1', '装配有误');

insert into TEST_TABLE (GID, ID_NUMBER, CHECK_DATE, UNIT_NAME, CHECK_PART, HAS_BUG, QUESTION_DESC)
values ('8adf8u875ec3975e015ed5f810d70ba9', 'J0001', to_date('22-05-2018 13:12:29', 'dd-mm-yyyy hh24:mi:ss'), '涂装', '油漆', '1', '侧车身面漆不均');

insert into TEST_TABLE (GID, ID_NUMBER, CHECK_DATE, UNIT_NAME, CHECK_PART, HAS_BUG, QUESTION_DESC)
values ('8adf8u875ec39755015ed5f810d70ba9', 'J0002', to_date('22-05-2018 13:12:29', 'dd-mm-yyyy hh24:mi:ss'), '焊装', '划伤', '1', '左前门划伤');

...全文
199 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
般若 2018-11-22
  • 打赏
  • 举报
回复
需要的结果是达到了,谢谢。期待您给点学习建议。
般若 2018-11-22
  • 打赏
  • 举报
回复
是我太菜还是撒/对我来说无从下手的sql,你这很快就能写出来,你写出来我还要看好大一会才能看懂,以前的分类函数都不常用 只用过少部分。我应该怎么样去锻炼这种能力(大神,不方便留QQ的话,说点建议呗)
nayi_224 2018-11-21
  • 打赏
  • 举报
回复
我上面写的那个是暴力查法,它会产生0.5n^2的“空间复杂度”。如果AUQC_VEHICLE_QUALITY数据量过大,可能会查不出来,尽量缩小下筛选条件吧。 之后又试了好几种写法,但是一加上distinct就报错,最后用标量子查询写了一个,效率应该能高一点。
select to_char(t1.check_date, 'yyyymmdd') dat,
       regexp_substr(t1.temp_str, '[^_]+', 1, 1) total_num,
       regexp_substr(t1.temp_str, '[^_]+', 1, 2) bug_num
  from (select t1.*,
               decode(row_number()
                      over(partition by trunc(t1.check_date) order by t1.gid),
                      1,
                      (select count(distinct t2.id_number) || '_' ||
                              count(distinct
                                    decode(t2.has_bug, '1', t2.id_number, null))
                         from test_table t2
                        where trunc(t2.check_date) <= trunc(t1.check_date)),
                      null) temp_str
          from test_table t1) t1
 where t1.temp_str is not null
 order by t1.check_date;
unit_name可以考虑加到partition中 ps:数据量真的大的话,可以考虑写个日过程刷数。
般若 2018-11-21
  • 打赏
  • 举报
回复
能把这个SQL优化一下就好了,其他的按照责任单位查询,直接加个where条件就可以了,是我心急了方便加QQ吗,我发一个sql文件和建表语句给你,你执行下这上面你好像不能直接发文件呢?
般若 2018-11-21
  • 打赏
  • 举报
回复
效果很慢
般若 2018-11-21
  • 打赏
  • 举报
回复
您好,方便留下你的联系方式吗? QQ或者微信都可以 用这段SQL套用我自己的表(AUQC_VEHICLE_QUALITY),查询效率就比较慢。 这个表中的几个关键字段 和 上面的 test_table 表的几个关键字段表达的意思一致。看能否把 责任单位 unit_name 给留出来,上面是对所有责任单位unit_name 进行汇总统计 出每天的合格率,还有个相近的问题的问题是: 根据责任单位 unit_name 查询每天的合格率? 大神拜托
nayi_224 2018-11-21
  • 打赏
  • 举报
回复
select t1.*, (t1.total_num - t1.bug_num) / t1.total_num per
  from (select count(distinct t2.id_number) total_num,
               count(distinct decode(t2.has_bug, '1', t2.id_number, null)) bug_num,
               t1.cd
          from (select distinct trunc(t1.check_date) cd from test_table t1) t1,
               test_table t2
         where trunc(t2.check_date) <= t1.cd
         group by cd) t1
 order by t1.cd;
般若 2018-11-21
  • 打赏
  • 举报
回复
这个问题已经纠结几天了(上几次虽然帮我解答了,却没有得到根本解决,是我举例的方式有点不恰当),本来想给你我这边的原始表和数据的,但是量比较大,所以贴出了上面的表结构。下面更正一下期望值
般若 2018-11-21
  • 打赏
  • 举报
回复
@nayi_224 是的,不好意思,我数错了,一直在等你,上次也是你帮我回答的问题。
nayi_224 2018-11-21
  • 打赏
  • 举报
回复
2018/5/21的5是怎么数出来的,我看着应该是7啊。

17,086

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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