SQL Server:从count()

时间:2016-06-07 11:36:18

标签: sql sql-server

我正在SQL Server数据库中创建报告。我将首先展示它的代码,然后描述它的作用以及问题在哪里。

SELECT 
    COUNT(e.flowid) AS [count], 
    t.name AS [process], 
    CAST(DATEPART(YEAR, e.dtcr) AS VARCHAR) + '-' + CAST(RIGHT('0' + RTRIM(DATEPART(MONTH, e.dtcr)), 2) AS VARCHAR) + '-' + CAST(RIGHT('0' + RTRIM(DATEPART(DAY, e.dtcr)), 2) AS VARCHAR) AS [day]
FROM 
    dbo.[Event] e  
JOIN 
    dbo.Flow f ON e.flowid = f.id 
JOIN 
    dbo.WorkOrder o ON f.workorderno = o.number 
                    AND o.treenodeid IN (26067, 26152, 2469, 1815, 1913) -- only from requested processes 
JOIN 
    dbo.TreeNode t ON o.treenodeid = t.id -- for process name in select statement
JOIN  
    dbo.Product p ON f.productid = p.id
                  AND p.materialid NOT IN (26094, 27262, 27515, 27264, 28192, 28195, 26090, 26092, 26093, 27065, 26969, 27471, 28351, 28353, 28356, 28976, 27486, 29345, 29346, 27069, 28653, 28654, 26735, 26745, 28686) -- exclude unwanted family codes
WHERE 
    e.pass = 1 -- only passed units
    AND e.treenodeid IN (9036, 9037, 9038, 9039, 12594, 26330) -- only from requested events
    AND e.dtcr BETWEEN '2015-12-01 00:00:00.000' AND '2016-05-31 23:59:59.999' -- only from requested time interval 
GROUP BY 
    DATEPART(YEAR, e.dtcr), DATEPART(MONTH, e.dtcr), DATEPART(DAY, e.dtcr), t.name
ORDER BY 
    [day]

查询的作用是计算在一段时间内传递特定事件的单位(使用某些过滤器)。

重要的表格是:

  1. 事件 - 基本上记录通过特定事件的单位。
  2. 产品 - 单位清单。
  3. 输出是这样的:

    COUNT   PROCESS     DAY
    71      Process-1   2015-12-01
    1067    Process-2   2015-12-01
    8       Process-3   2015-12-01
    3       Process-4   2015-12-01
    15      Process-1   2015-12-02
    276     Process-2   2015-12-02
    47      Process-3   2015-12-02
    54      Process-4   2015-12-02
    

    它做得很好,但有一个问题。在某些特定情况下,单位可以多次传递相同的事件,并且此查询计算每次这样的传递。我只需要计算一次每个单位。

    “重复”记录在事件表中。他们有不同的日期和ID。所有记录都相同,我只需要计算一次是flowid。有没有简单的方法来实现这个目标?

    感谢您的时间和答案!

2 个答案:

答案 0 :(得分:0)

听起来你需要第一次通过阈值。您可以第一次使用row_number()。对于查询的附加条件,这可能很棘手。此修改可能适合您:

select sum(case when seqnum = 1 then 1 else 0 end) as cnt,
       . . .
from (select e.*,
             row_number() over (partition by eventid order by e.dtcr) as seqnum
      from event e
      where e.pass = 1 and  -- only passed units
            e.treenodeid IN (9036, 9037, 9038, 9039, 12594, 26330) and
            e.dtcr >= '2015-12-01' AND e.dtcr < '2016-06-01'
     ) e join 
     . . .

您没有指定如何为重复项识别相同的事件。以上使用eventid来实现此目的。

答案 1 :(得分:0)

要仅对每个flowid计数一次,请执行count(distinct flowid),即

SELECT 
    COUNT(distinct e.flowid) AS [count], 
    t.name AS [process], 
    CAST(DATEPART(YEAR, e.dtcr) AS VARCHAR) + '-' + CAST(RIGHT('0' + RTRIM(DATEPART(MONTH, e.dtcr)), 2) AS VARCHAR) + '-' + CAST(RIGHT('0' + RTRIM(DATEPART(DAY, e.dtcr)), 2) AS VARCHAR) AS [day]
FROM
...