2016-06-07 182 views
0

我在SQL Server數據庫中創建報告。我將首先顯示它的代碼,然後描述它的作用和問題。SQL Server:從count()中刪除重複項

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. 產品 - 單位列表。

輸出是這樣的:

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。我只需要計數一次的所有記錄都是一樣的。有沒有簡單的方法來實現這一點?

謝謝你的時間和答案!

+1

你的意思'計數(不同的流ID)'? – jarlh

+0

你是認真的嗎,真的那麼簡單嗎? (是的,我嘗試過,現在我覺得自己像個白癡。)請將它添加爲答案,以便我可以將其標記爲正確的。 – Andrew

回答

0

要計算每個流ID只有一次,做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 
... 
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