如何仅使用SQL计算单个列的列中的值实例?

时间:2013-10-31 12:13:06

标签: sql sql-server sql-server-2008

假设以下内容 - 我正在记录(在单个表中)在许多业务流程的完整日期中经过的持续时间。 持续时间可以是1天至50天。 假设有20种不同的流程类型被监控,并且在每种流程类型中,单个流程实例的持续时间可以在最小和最大持续时间范围(1 - 50)之间。

例如 -

表1第1列将列出过程1的记录持续时间值(示例值 - 23,5,17,41,...)。

表1第2列将列出过程2的记录持续时间值。

表1第3列将列出过程3的记录持续时间值... 等等。

必填 -

我想获取这些数据,并在第二个表中,针对每个流程类型计算特定持续时间发生的次数。

例如 -

表2第1列将列出(按升序排列)可能的持续时间值(1到50)。

后续的表2列将表示(对于第1列中的每个值)每个流程类型(每个流程类型一列)的每个流程的频率计数。

因此,例如,在流程1中,35天的持续时间可能会发生46次,而在流程2中,可能会发生23次。

希望这是有道理的!

这在SQL Server中是否可行?如果是这样,我该如何实现? 优选地,这应该采取尽可能少的步骤,尽可能少的用户交互 - 如果可以的话! 此外,如果将来我需要监控更多流程,会发生什么?

1 个答案:

答案 0 :(得分:1)

如果您不介意每当流程类型的数量发生变化时都必须手动更改查询,那么应该这样做(给出了4种流程类型的示例):

;With Sequence([Days]) as
(
    Select 1 as [Days]
        union all
    Select [Days] + 1
        from Sequence
        where [Days] < 50
)
select
  S.[Days]
  ,Count(case when P.[P1]=S.[Days] then 1 end) AS [P1Count]
  ,Count(case when P.[P2]=S.[Days] then 1 end) AS [P2Count]
  ,Count(case when P.[P3]=S.[Days] then 1 end) AS [P3Count]
  ,Count(case when P.[P4]=S.[Days] then 1 end) AS [P4Count]
from Sequence S, ProcessDuration P
group by S.[Days]

顶部的Sequence cte生成数字1到50.然后输出使用带有Count语句的case来计算每种流程类型与天数的匹配。输出是左侧为1-50的网格,以及连续列中每种过程类型的计数。

您需要修改表/列名称以与您的特定架构相关。

演示:http://www.sqlfiddle.com/#!3/b51da/5