急需大神求解

qq_31669825 2015-10-09 07:24:04
表1
PRODUCT_SN MC_CODE OP_CODE QUALITY_STATUS
20150101 A 001 0
20150102 A 001 0
20150103 A 001 0
20150101 B 002 1
20150102 B 002 0
20150102 B 003 1
20150102 C 004 1

注:PRODUCT_SN--产品序列号;MC_CODE--物料号;OP_CODE--工序号;QUALITY_STATUS--质量状态(0代表合格,1代表不合格,只要一道工序的QUALITY_STATUS=1就代表该产品不合格)

要统计的结果如下(按照物料号分类统计):
MC_CODE HGS TOTAL HGL
A 1 3 33.33%
B 1 2 50.00%
C 0 1 0.00%

注:HGS--合格数 ; TOTAL--总数;HGL--合格率

如何写出该统计的存储过程求大神帮忙,尤其合格数怎么统计出来,谢谢!
...全文
181 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_31669825 2015-10-11
  • 打赏
  • 举报
回复
试了下,貌似是对的,但是不是太能理解你写的‘rn’,还是感谢你的帮助,我自己试着写出来一个

with a as (select sum(QTY_STATUS) as QTY ,PRODUCT_SN FROM dbo.Table_1 GROUP BY PRODUCT_SN),

b as (select PRODUCT_SN,
sum(case when QTY = 0 then 1 when QTY<>0 then 0 else null end) as HGS from a group by PRODUCT_SN),

c as (select A.MC_CODE,sum(B.HGS) as HGS,count(DISTINCT A.PRODUCT_SN) as TOTAL,
CONVERT(varchar(6),CONVERT(decimal(5,2),sum(B.HGS)*100.0/count(DISTINCT A.PRODUCT_SN))
)+'%' HGL from Table_1 A inner join b B on A.PRODUCT_SN=B.PRODUCT_SN group by A.MC_CODE)
select D.MC_NAME,C.HGS,C.TOTAL,C.HGL from dbo.MC D inner join c C on D.MC_CODE=C.MC_CODE;
道玄希言 2015-10-10
  • 打赏
  • 举报
回复
引用 7 楼 qq_31669825 的回复:
我试了下,确实能用,谢谢
悠着点。。。 我还是有点不明白, HGS--合格数 到底是怎么算出来的。 我的代码,在將不同序列号的物料号合并时, 这个 HGS--合格数 其实是没有进行计算的。 你第一条, 物料A 总数是 3 ,这个理解, 那为啥 HGS--合格数 只是1 而不是 3 呢?不是三个序列号的产品,都合格了么。。。 还有,物料 B 合格数为0 理解,但是 如果数据是这样: '20150101', 'B', '002', 0 '20150102', 'B', '002', 0 '20150102', 'B', '003', 1 那序列号 ‘20150102’ ,因为有一个批次不合格, 所以整体该批次不合格,为 1 这个HGS--合格数是不是 1 呢? 合格产品数,应该是下面语句才对吧。 (count(MC_CODE) - sum(QUALITY_STATUS)) as HGS
qq_31669825 2015-10-10
  • 打赏
  • 举报
回复
引用 4 楼 yangb0803 的回复:
上面是我弄错了, 沒注意序列号。。。


;with tbl1(PRODUCT_SN,MC_CODE,OP_CODE,QUALITY_STATUS) as 
(
select '20150101', 'A', '001',0 union all
select '20150102', 'A', '001',0 union all
select '20150103', 'A', '001',0 union all
select '20150101', 'B', '002',1 union all
select '20150102', 'B', '002',0 union all
select '20150102', 'B', '003',1 union all
select '20150102', 'C', '004',1
),
tbl2 as 
(
select 
  PRODUCT_SN, MC_CODE, 
  max(QUALITY_STATUS) as  QUALITY_STATUS
from tbl1
group by PRODUCT_SN, MC_CODE
)

select 
  MC_CODE, 
  case max(QUALITY_STATUS) when 1 then 0 else 1 end as HGS,
  count(MC_CODE) as TOTAL,
  convert(nvarchar(10), convert(decimal(8,2),
  (100.0 * (case max(QUALITY_STATUS) when 1 then 0 else 1 end)/count(MC_CODE)))) + '%'  as HGL
from tbl2
group by MC_CODE
我试了下,确实能用,谢谢
qq_31669825 2015-10-10
  • 打赏
  • 举报
回复
引用 5 楼 wmxcn2000 的回复:
楼主,你把数据重新整理一下,发上来吧,这样 A 的数量不大对,B 也有些问题。
表1 PRODUCT_SN MC_CODE OP_CODE QUALITY_STATUS 20150101 A 001 0 20150102 A 001 0 20150103 A 001 0 20150101 B 002 1 20150102 B 002 0 20150102 B 003 1 20150102 C 004 1 注:PRODUCT_SN--产品序列号;MC_CODE--物料号;OP_CODE--工序号;QUALITY_STATUS--质量状态(0代表合格,1代表不合格,只要一道工序的QUALITY_STATUS=1就代表该产品不合格) 要统计的结果如下(按照物料号分类统计): MC_CODE HGS TOTAL HGL A 1 3 33.33% B 0 2 0.00% C 0 1 0.00% 注:HGS--合格数 ; TOTAL--总数;HGL--合格率 A的数据是对的,不知道您说的A的数量不大对指什么
道玄希言 2015-10-10
  • 打赏
  • 举报
回复
上面是我弄错了, 沒注意序列号。。。


;with tbl1(PRODUCT_SN,MC_CODE,OP_CODE,QUALITY_STATUS) as 
(
select '20150101', 'A', '001',0 union all
select '20150102', 'A', '001',0 union all
select '20150103', 'A', '001',0 union all
select '20150101', 'B', '002',1 union all
select '20150102', 'B', '002',0 union all
select '20150102', 'B', '003',1 union all
select '20150102', 'C', '004',1
),
tbl2 as 
(
select 
  PRODUCT_SN, MC_CODE, 
  max(QUALITY_STATUS) as  QUALITY_STATUS
from tbl1
group by PRODUCT_SN, MC_CODE
)

select 
  MC_CODE, 
  case max(QUALITY_STATUS) when 1 then 0 else 1 end as HGS,
  count(MC_CODE) as TOTAL,
  convert(nvarchar(10), convert(decimal(8,2),
  (100.0 * (case max(QUALITY_STATUS) when 1 then 0 else 1 end)/count(MC_CODE)))) + '%'  as HGL
from tbl2
group by MC_CODE
卖水果的net 2015-10-10
  • 打赏
  • 举报
回复
楼主,你把数据重新整理一下,发上来吧,这样 A 的数量不大对,B 也有些问题。
道玄希言 2015-10-10
  • 打赏
  • 举报
回复
引用 楼主 qq_31669825 的回复:
表1 PRODUCT_SN MC_CODE OP_CODE QUALITY_STATUS 20150101 A 001 0 20150102 A 001 0 20150103 A 001 0 20150101 B 002 1 20150102 B 002 0 20150102 B 003 1 20150102 C 004 1 注:PRODUCT_SN--产品序列号;MC_CODE--物料号;OP_CODE--工序号;QUALITY_STATUS--质量状态(0代表合格,1代表不合格,只要一道工序的QUALITY_STATUS=1就代表该产品不合格) 要统计的结果如下(按照物料号分类统计): MC_CODE HGS TOTAL HGL A 1 3 33.33% B 1 2 50.00% C 0 1 0.00% 注:HGS--合格数 ; TOTAL--总数;HGL--合格率 如何写出该统计的存储过程求大神帮忙,尤其合格数怎么统计出来,谢谢!
这里的 TOTAL--总数 是怎么来的, 按照第一条 A 的total 为3 ,那第二条 B的 total 怎么说, 总数都不可能是 2額。。。
qq_31669825 2015-10-10
  • 打赏
  • 举报
回复
引用 1 楼 qq_17482963 的回复:
看不太懂你的统计方法 比如那个B 合格数怎么是1 按照你提供的数据 “20150101-B-002”不合格 “20150102-B-003 ”也不合格 那B的合格数不是0吗
是的,不好意思,这个数据我弄错了,应该是 MC_CODE HGS TOTAL HGL B 0 2 0.00%
qq_17482963 2015-10-10
  • 打赏
  • 举报
回复
with tb(PRODUCT_SN,MC_CODE,OP_CODE,QUALITY_STATUS) as
(
select '20150101', 'A', '001',0 union all
select '20150102', 'A', '001',0 union all
select '20150103', 'A', '001',0 union all
select '20150101', 'B', '002',1 union all
select '20150102', 'B', '002',0 union all
select '20150102', 'B', '003',1 union all
select '20150102', 'C', '004',1 union all
select '20150104', 'A', '002',0 union all
select '20150104', 'A', '003',0 union all
select '20150104', 'A', '004',0
),
tb1 as
(
select *,ROW_NUMBER()over(PARTITION by PRODUCT_SN,MC_CODE order by MC_CODE)rn from tb
),
tb2 as
(
select PRODUCT_SN,MC_CODE from tb where PRODUCT_SN not in (select PRODUCT_SN from tb where QUALITY_STATUS=1) group by PRODUCT_SN,MC_CODE
)
select a.MC_CODE,
COUNT(distinct b.PRODUCT_SN)HGS,
count(a.rn)Total,
convert(nvarchar(10),convert(decimal(18,2),convert(decimal(18,2),COUNT(distinct b.PRODUCT_SN))/convert(decimal(18,2),count(a.rn))*100))+'%' HGL from tb1 a
left join tb2 b on a.MC_CODE=b.MC_CODE and a.PRODUCT_SN=b.PRODUCT_SN
where a.rn=1
group by a.MC_CODE
是这样子吗
qq_31669825 2015-10-10
  • 打赏
  • 举报
回复
引用 10 楼 yangb0803 的回复:
[quote=引用 9 楼 qq_31669825 的回复:] MC_CODE 为A的记录 HGS 按理应该是2,所以这个统计有问题啊,求解,谢谢
HGS 你到底是怎么得来的? 看不明白啊 。。。[/quote] HGS---合格数,根据MC_CODE来分类统计,这里合格数指的产品啊,一个产品有多道工序的话,只要一道工序不合格,那么这个产品就是不合格的,那么该产品对应的物料号统计出来的合格数就都是0,不知道是否理解了
道玄希言 2015-10-10
  • 打赏
  • 举报
回复
引用 9 楼 qq_31669825 的回复:
MC_CODE 为A的记录 HGS 按理应该是2,所以这个统计有问题啊,求解,谢谢
HGS 你到底是怎么得来的? 看不明白啊 。。。
qq_31669825 2015-10-10
  • 打赏
  • 举报
回复
引用 4 楼 yangb0803 的回复:
上面是我弄错了, 沒注意序列号。。。


;with tbl1(PRODUCT_SN,MC_CODE,OP_CODE,QUALITY_STATUS) as 
(
select '20150101', 'A', '001',0 union all
select '20150102', 'A', '001',0 union all
select '20150103', 'A', '001',0 union all
select '20150101', 'B', '002',1 union all
select '20150102', 'B', '002',0 union all
select '20150102', 'B', '003',1 union all
select '20150102', 'C', '004',1
),
tbl2 as 
(
select 
  PRODUCT_SN, MC_CODE, 
  max(QUALITY_STATUS) as  QUALITY_STATUS
from tbl1
group by PRODUCT_SN, MC_CODE
)

select 
  MC_CODE, 
  case max(QUALITY_STATUS) when 1 then 0 else 1 end as HGS,
  count(MC_CODE) as TOTAL,
  convert(nvarchar(10), convert(decimal(8,2),
  (100.0 * (case max(QUALITY_STATUS) when 1 then 0 else 1 end)/count(MC_CODE)))) + '%'  as HGL
from tbl2
group by MC_CODE
我添加了3条数据实验发现统计出来的数据不对,如下代码和结果 with tbl1(PRODUCT_SN,MC_CODE,OP_CODE,QUALITY_STATUS) as ( select '20150101', 'A', '001',0 union all select '20150102', 'A', '001',0 union all select '20150103', 'A', '001',0 union all select '20150101', 'B', '002',1 union all select '20150102', 'B', '002',0 union all select '20150102', 'B', '003',1 union all select '20150102', 'C', '004',1 union all select '20150104', 'A', '002',0 union all select '20150104', 'A', '003',0 union all select '20150104', 'A', '004',0 ), tbl2 as ( select PRODUCT_SN, MC_CODE, max(QUALITY_STATUS) as QUALITY_STATUS from tbl1 group by PRODUCT_SN, MC_CODE ) select MC_CODE, case max(QUALITY_STATUS) when 1 then 0 else 1 end as HGS, count(MC_CODE) as TOTAL, convert(nvarchar(10), convert(decimal(8,2), (100.0 * (case max(QUALITY_STATUS) when 1 then 0 else 1 end)/count(MC_CODE)))) + '%' as HGL from tbl2 group by MC_CODE MC_CODE HGS TOTAL HGL A 1 4 25.00% B 0 2 0.00% C 0 1 0.00% MC_CODE 为A的记录 HGS 按理应该是2,所以这个统计有问题啊,求解,谢谢
qq_17482963 2015-10-09
  • 打赏
  • 举报
回复
看不太懂你的统计方法 比如那个B 合格数怎么是1 按照你提供的数据 “20150101-B-002”不合格 “20150102-B-003 ”也不合格 那B的合格数不是0吗

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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