请问如何做到按固定计数来分段汇总统计?

huangbochn 2015-10-27 03:43:03
示例数据如下,需要统计每10件为一个区间的次品率(一个CHECK表示意见,NG表示这件是次品)。目前我能想到的办法就是用触发器和临时表,但效率太低了。请教是否可以直接写SQL?
要求结果如下:
区间 检查数 次品数 次品率
1 10 2 0.2
2 12 1 0.08
Select 'Check' AS 'Check',NULL AS NG,'2015-10-27 15:35:01' AS dDateTime
UNION ALL
Select 'Check' AS 'Check','NG' AS NG,'2015-10-27 15:35:21' AS dDateTime
UNION ALL
Select 'Check' AS 'Check',NULL AS NG,'2015-10-27 15:35:51' AS dDateTime
UNION ALL
Select 'Check' AS 'Check',NULL AS NG,'2015-10-27 15:36:01' AS dDateTime
UNION ALL
Select 'Check' AS 'Check',NULL AS NG,'2015-10-27 15:36:21' AS dDateTime
UNION ALL
Select 'Check' AS 'Check','NG' AS NG,'2015-10-27 15:36:59' AS dDateTime
UNION ALL
Select 'Check' AS 'Check',NULL AS NG,'2015-10-27 15:38:19' AS dDateTime
UNION ALL
Select 'Check' AS 'Check',NULL AS NG,'2015-10-27 15:39:56' AS dDateTime
UNION ALL
Select 'Check' AS 'Check','NG' AS NG,'2015-10-27 15:39:44' AS dDateTime
UNION ALL
Select 'Check' AS 'Check','NG' AS NG,'2015-10-27 15:40:33' AS dDateTime
UNION ALL
Select 'Check' AS 'Check','NG' AS NG,'2015-10-27 15:41:22' AS dDateTime
UNION ALL
Select 'Check' AS 'Check',NULL AS NG,'2015-10-27 15:42:11' AS dDateTime
UNION ALL
Select 'Check' AS 'Check',NULL AS NG,'2015-10-27 15:43:23' AS dDateTime
UNION ALL
Select 'Check' AS 'Check',NULL AS NG,'2015-10-27 15:44:10' AS dDateTime
UNION ALL
Select 'Check' AS 'Check',NULL AS NG,'2015-10-27 15:45:11' AS dDateTime
UNION ALL
Select 'Check' AS 'Check','NG' AS NG,'2015-10-27 15:46:56' AS dDateTime
UNION ALL
Select 'Check' AS 'Check',NULL AS NG,'2015-10-27 15:47:46' AS dDateTime
UNION ALL
Select 'Check' AS 'Check',NULL AS NG,'2015-10-27 15:48:34' AS dDateTime
UNION ALL
Select 'Check' AS 'Check',NULL AS NG,'2015-10-27 15:49:26' AS dDateTime
UNION ALL
Select 'Check' AS 'Check',NULL AS NG,'2015-10-27 15:50:19' AS dDateTime
UNION ALL
Select 'Check' AS 'Check','NG' AS NG,'2015-10-27 15:51:06' AS dDateTime
UNION ALL
Select 'Check' AS 'Check','NG' AS NG,'2015-10-27 15:52:24' AS dDateTime
UNION ALL
Select 'Check' AS 'Check',NULL AS NG,'2015-10-27 15:53:33' AS dDateTime
UNION ALL
Select 'Check' AS 'Check',NULL AS NG,'2015-10-27 15:54:12' AS dDateTime
UNION ALL
Select 'Check' AS 'Check',NULL AS NG,'2015-10-27 15:55:02' AS dDateTime
UNION ALL
Select 'Check' AS 'Check',NULL AS NG,'2015-10-27 15:56:11' AS dDateTime

...全文
219 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
huangbochn 2015-10-27
  • 打赏
  • 举报
回复
引用 1 楼 yangb0803 的回复:

;with tb01 as
(
Select 'Check' AS 'Check',NULL AS NG,'2015-10-27 15:35:01' AS dDateTime
UNION ALL
Select 'Check' AS 'Check','NG' AS NG,'2015-10-27 15:35:21' AS dDateTime
UNION ALL
Select 'Check' AS 'Check',NULL AS NG,'2015-10-27 15:35:51' AS dDateTime
UNION ALL
Select 'Check' AS 'Check',NULL AS NG,'2015-10-27 15:36:01' AS dDateTime
UNION ALL
Select 'Check' AS 'Check',NULL AS NG,'2015-10-27 15:36:21' AS dDateTime
UNION ALL
Select 'Check' AS 'Check','NG' AS NG,'2015-10-27 15:36:59' AS dDateTime
UNION ALL
Select 'Check' AS 'Check',NULL AS NG,'2015-10-27 15:38:19' AS dDateTime
UNION ALL
Select 'Check' AS 'Check',NULL AS NG,'2015-10-27 15:39:56' AS dDateTime
UNION ALL
Select 'Check' AS 'Check','NG' AS NG,'2015-10-27 15:39:44' AS dDateTime
UNION ALL
Select 'Check' AS 'Check','NG' AS NG,'2015-10-27 15:40:33' AS dDateTime
UNION ALL
Select 'Check' AS 'Check','NG' AS NG,'2015-10-27 15:41:22' AS dDateTime
UNION ALL
Select 'Check' AS 'Check',NULL AS NG,'2015-10-27 15:42:11' AS dDateTime
UNION ALL
Select 'Check' AS 'Check',NULL AS NG,'2015-10-27 15:43:23' AS dDateTime
UNION ALL
Select 'Check' AS 'Check',NULL AS NG,'2015-10-27 15:44:10' AS dDateTime
UNION ALL
Select 'Check' AS 'Check',NULL AS NG,'2015-10-27 15:45:11' AS dDateTime
UNION ALL
Select 'Check' AS 'Check','NG' AS NG,'2015-10-27 15:46:56' AS dDateTime
UNION ALL
Select 'Check' AS 'Check',NULL AS NG,'2015-10-27 15:47:46' AS dDateTime
UNION ALL
Select 'Check' AS 'Check',NULL AS NG,'2015-10-27 15:48:34' AS dDateTime
UNION ALL
Select 'Check' AS 'Check',NULL AS NG,'2015-10-27 15:49:26' AS dDateTime
UNION ALL
Select 'Check' AS 'Check',NULL AS NG,'2015-10-27 15:50:19' AS dDateTime
UNION ALL
Select 'Check' AS 'Check','NG' AS NG,'2015-10-27 15:51:06' AS dDateTime
UNION ALL
Select 'Check' AS 'Check','NG' AS NG,'2015-10-27 15:52:24' AS dDateTime
UNION ALL
Select 'Check' AS 'Check',NULL AS NG,'2015-10-27 15:53:33' AS dDateTime
UNION ALL
Select 'Check' AS 'Check',NULL AS NG,'2015-10-27 15:54:12' AS dDateTime
UNION ALL
Select 'Check' AS 'Check',NULL AS NG,'2015-10-27 15:55:02' AS dDateTime
UNION ALL
Select 'Check' AS 'Check',NULL AS NG,'2015-10-27 15:56:11' AS dDateTime
)
,tb02 as(
select 
    ROW_NUMBER() OVER(order by dDateTime)-1 as tid, 
    case [NG] when 'NG' then 1 else 0 end as NG1, 
	[Check], NG, dDateTime 
from tb01
)
--select * from tb02
select  
  min(dDateTime) as [开始时间], 
  max(dDateTime) as [结束时间], 
  convert(decimal(4,2), 1.0*sum(NG1)/10) as [次品率]
from tb02 group by tid/10

开始时间	结束时间	次品率
2015-10-27 15:35:01	2015-10-27 15:40:33	0.40
2015-10-27 15:41:22	2015-10-27 15:50:19	0.20
2015-10-27 15:51:06	2015-10-27 15:56:11	0.20
看过您的代码,核心的难点已经帮我解决了。我先结贴,不耽误您时间。如果后续我还搞不定,会再开贴邀请您。谢谢。
huangbochn 2015-10-27
  • 打赏
  • 举报
回复
引用 2 楼 yangb0803 的回复:
額, 添加了条件了啊... 每次检查的数量区间都是变化的么? 从你给的测试数据中, 貌似找不出连续的 12条纪录, 只有一条纪录标记为 ‘NG’ 的額
谢谢您的耐心回复。很抱歉,我表达不够清晰。 这是一个查货流水,查一件就会有一条记录,如果这条记录后面的NG不是NULL值(假设为'NG'),那就认为这件是次品。 第1件到第10件为一个区间,第11件到第20件为一个区间。次品率就是区间里面10件的次品数/10。每个区间的产品不重复统计的,一个产品只在某个区间统计一次。 您给的结果加了开始时间和结束时间,这也是需要的,这个我倒是忘记了。最后的结果是这样的: 区间 检查数 次品数 次品率 开始时间 结束时间 1 10 2 0.2 xx:xx xx:xx 2 12 1 0.08 xx:xx xx:xx
道玄希言 2015-10-27
  • 打赏
  • 举报
回复
額, 添加了条件了啊... 每次检查的数量区间都是变化的么? 从你给的测试数据中, 貌似找不出连续的 12条纪录, 只有一条纪录标记为 ‘NG’ 的額 ;with tb02 as( select ROW_NUMBER() OVER(order by dDateTime desc) as tid, case [NG] when 'NG' then 1 else 0 end as NG1, [Check], NG, dDateTime from tb01 ) --select * from tb02 select 1 as 区间, 10 as 检查数, convert(decimal(4,2), 1.0*sum(NG1)/10) as [次品率] from tb02 where tid <=10 union select 2 as 区间, 12 as 检查数, convert(decimal(4,2), 1.0*sum(NG1)/12) as [次品率] from tb02 where tid > 10 and tid <= 22
道玄希言 2015-10-27
  • 打赏
  • 举报
回复

;with tb01 as
(
Select 'Check' AS 'Check',NULL AS NG,'2015-10-27 15:35:01' AS dDateTime
UNION ALL
Select 'Check' AS 'Check','NG' AS NG,'2015-10-27 15:35:21' AS dDateTime
UNION ALL
Select 'Check' AS 'Check',NULL AS NG,'2015-10-27 15:35:51' AS dDateTime
UNION ALL
Select 'Check' AS 'Check',NULL AS NG,'2015-10-27 15:36:01' AS dDateTime
UNION ALL
Select 'Check' AS 'Check',NULL AS NG,'2015-10-27 15:36:21' AS dDateTime
UNION ALL
Select 'Check' AS 'Check','NG' AS NG,'2015-10-27 15:36:59' AS dDateTime
UNION ALL
Select 'Check' AS 'Check',NULL AS NG,'2015-10-27 15:38:19' AS dDateTime
UNION ALL
Select 'Check' AS 'Check',NULL AS NG,'2015-10-27 15:39:56' AS dDateTime
UNION ALL
Select 'Check' AS 'Check','NG' AS NG,'2015-10-27 15:39:44' AS dDateTime
UNION ALL
Select 'Check' AS 'Check','NG' AS NG,'2015-10-27 15:40:33' AS dDateTime
UNION ALL
Select 'Check' AS 'Check','NG' AS NG,'2015-10-27 15:41:22' AS dDateTime
UNION ALL
Select 'Check' AS 'Check',NULL AS NG,'2015-10-27 15:42:11' AS dDateTime
UNION ALL
Select 'Check' AS 'Check',NULL AS NG,'2015-10-27 15:43:23' AS dDateTime
UNION ALL
Select 'Check' AS 'Check',NULL AS NG,'2015-10-27 15:44:10' AS dDateTime
UNION ALL
Select 'Check' AS 'Check',NULL AS NG,'2015-10-27 15:45:11' AS dDateTime
UNION ALL
Select 'Check' AS 'Check','NG' AS NG,'2015-10-27 15:46:56' AS dDateTime
UNION ALL
Select 'Check' AS 'Check',NULL AS NG,'2015-10-27 15:47:46' AS dDateTime
UNION ALL
Select 'Check' AS 'Check',NULL AS NG,'2015-10-27 15:48:34' AS dDateTime
UNION ALL
Select 'Check' AS 'Check',NULL AS NG,'2015-10-27 15:49:26' AS dDateTime
UNION ALL
Select 'Check' AS 'Check',NULL AS NG,'2015-10-27 15:50:19' AS dDateTime
UNION ALL
Select 'Check' AS 'Check','NG' AS NG,'2015-10-27 15:51:06' AS dDateTime
UNION ALL
Select 'Check' AS 'Check','NG' AS NG,'2015-10-27 15:52:24' AS dDateTime
UNION ALL
Select 'Check' AS 'Check',NULL AS NG,'2015-10-27 15:53:33' AS dDateTime
UNION ALL
Select 'Check' AS 'Check',NULL AS NG,'2015-10-27 15:54:12' AS dDateTime
UNION ALL
Select 'Check' AS 'Check',NULL AS NG,'2015-10-27 15:55:02' AS dDateTime
UNION ALL
Select 'Check' AS 'Check',NULL AS NG,'2015-10-27 15:56:11' AS dDateTime
)
,tb02 as(
select 
    ROW_NUMBER() OVER(order by dDateTime)-1 as tid, 
    case [NG] when 'NG' then 1 else 0 end as NG1, 
	[Check], NG, dDateTime 
from tb01
)
--select * from tb02
select  
  min(dDateTime) as [开始时间], 
  max(dDateTime) as [结束时间], 
  convert(decimal(4,2), 1.0*sum(NG1)/10) as [次品率]
from tb02 group by tid/10

开始时间	结束时间	次品率
2015-10-27 15:35:01	2015-10-27 15:40:33	0.40
2015-10-27 15:41:22	2015-10-27 15:50:19	0.20
2015-10-27 15:51:06	2015-10-27 15:56:11	0.20

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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