2011-06-08 30 views
0

我正在創建一個存儲過程,它將根據輸入的時間返回開放式案例的結果 - 我想返回案例的計數,但是基於不同的辦公室。編輯我的代碼後,我也會重新說明我的問題不同 - 哪種方式最好是返回一個計數而不是我現在得到的實際結果。UNION在存儲過程COUNT

以下是我的存儲過程:

SELECT C.CaseId 
FROM [Case] C 
WHERE C.DateCreated <= @BeginDate 
    AND C.CaseId NOT IN (SELECT CaseId FROM CaseStatusChange CSC WHERE CSC.DateClosed < @BeginDate) 

UNION 

-- Also need the cases that reopened and are currently open 
SELECT ReOpened.CaseId FROM 
(
       SELECT C.CaseId, MAX(CSC.DateReopened) AS DateReOpened 
       FROM [Case] C 
       INNER JOIN [CaseStatusChange] CSC ON C.CaseId = CSC.CaseId 
       WHERE CSC.DateReopened <= @BeginDate 
       GROUP BY C.CaseId 
) ReOpened 
WHERE ReOpened.CaseId NOT IN 
(
       SELECT CaseId FROM CaseStatusChange 
       WHERE CaseId = ReOpened.CaseId AND 
       CaseStatusChange.DateClosed BETWEEN ReOpened.DateReopened AND @BeginDate 
) 

回答

1

更新:要包含OfficeId的要求:

SELECT OfficeId, SUM(CaseCount) 
FROM (
      SELECT COUNT(C.CaseId) AS CaseCount, 
        C.OfficeId 
      FROM [Case] C 
      WHERE C.DateCreated <= @BeginDate 
       AND C.CaseId NOT IN (SELECT CaseId FROM CaseStatusChange CSC WHERE CSC.DateClosed < @BeginDate) 
      GROUP BY C.OfficeId 

      UNION ALL 

      -- Also need the cases that reopened and are currently open 
      SELECT COUNT(ReOpened.CaseId) As CaseCount, 
        ReOpened.OfficeID 
      FROM 
       (
        SELECT C.CaseId, MAX(CSC.DateReopened) AS DateReOpened, C.OfficeId 
        FROM [Case] C 
        INNER JOIN [CaseStatusChange] CSC ON C.CaseId = CSC.CaseId 
        WHERE CSC.DateReopened <= @BeginDate 
        GROUP BY C.CaseId, C.OfficeID 
       ) ReOpened 
      WHERE ReOpened.CaseId NOT IN 
        (
         SELECT CaseId FROM CaseStatusChange 
         WHERE CaseId = ReOpened.CaseId AND 
         CaseStatusChange.DateClosed BETWEEN ReOpened.DateReopened AND @BeginDate 
        ) 
      GROUP BY OfficeID 
     ) AS OpenCasesCount 
GROUP BY OfficeId 

你需要用你的整個查詢的內部查詢,如下圖所示:

SELECT SUM(CaseCount) 
FROM (
      SELECT COUNT(C.CaseId) AS CaseCount 
      FROM [Case] C 
      WHERE C.DateCreated <= @BeginDate 
       AND C.CaseId NOT IN (SELECT CaseId FROM CaseStatusChange CSC WHERE CSC.DateClosed < @BeginDate) 

      UNION ALL 

      -- Also need the cases that reopened and are currently open 
      SELECT COUNT(ReOpened.CaseId) As CaseCount 
      FROM 
       (
        SELECT C.CaseId, MAX(CSC.DateReopened) AS DateReOpened 
        FROM [Case] C 
        INNER JOIN [CaseStatusChange] CSC ON C.CaseId = CSC.CaseId 
        WHERE CSC.DateReopened <= @BeginDate 
        GROUP BY C.CaseId 
       ) ReOpened 
      WHERE ReOpened.CaseId NOT IN 
        (
         SELECT CaseId FROM CaseStatusChange 
         WHERE CaseId = ReOpened.CaseId AND 
         CaseStatusChange.DateClosed BETWEEN ReOpened.DateReopened AND @BeginDate 
        ) 
     ) AS OpenCasesCount 
+0

謝謝!再次,你是最好的。 – Masriyah 2011-06-09 15:26:42

+0

我很抱歉,我知道我很痛苦,但我也想爲OfficeI添加一個參數,這樣我就可以得到每個辦公室有多少個開放案例。我會將它們添加到內部選擇語句嗎? – Masriyah 2011-06-09 15:41:26

+0

你需要在這種情況下使用GROUP BY,如SELECT COUNT(C.CaseId)AS CaseCount,OfficeID ... GROUP BY OfficeID ..所以,你的結果將成對的OfficeId和計數。 – Akhil 2011-06-09 16:27:27

2

這意味着,列在名單SELECT的數量必須匹配。他們的數據類型也是如此。

像這樣:

select 
    col1, col2, col3 
from 
    t1 
union 
select 
    col1, col2, col3 
from 
    t2 

你的具體情況,你需要添加OfficeID和計數在第二SELECT列表。

+0

是的,在OP的例子是看起來這兩個選擇是: SELECT C.CaseId,O.OfficeId和SELECT ReOpened.CaseId具有不同數量的參數。 – 2011-06-08 15:50:07

+0

子選擇中還有一個鬼鬼祟祟的COUNT()。 – 2011-06-08 15:51:22

+0

我編輯了我的代碼,並開始另一種方式,希望它會過分的結 – Masriyah 2011-06-08 16:19:59