2011-06-10 80 views
0

原來這就是我想這樣做,但現在我得到的錯誤是:不能使用聚合或在表達式中使用該組由一組列表BY子句不知道哪一部分的子查詢這意味着 - 我試圖基於兩個不同層面拿開的情況下整體碼一個是返回傳入根據日期範圍的情況下,另一種是返回基於剛剛開始日期之前它的情況。合併兩個存儲過程

幫助將是巨大的! :)

CODE:

SELECT 
     C.CaseNumber, 
     O.OfficeName, 
     CT.Description AS CaseType, 
     DATEADD(dd, 0, DATEDIFF(dd, 0, C.DateOpened)) AS DateOpened, 
     CR.Description AS Court, 
     CaseOfficeAppointment.OpenCases, 
     CaseOfficeAppointment.CloseCases 
FROM 
(
     SELECT C.CaseId, O.OfficeId, CRT.CourtId, 
     (
        SELECT COUNT(DISTINCT CD.CaseId) 
        FROM [Case] CD 
        INNER JOIN CaseOffice COD ON CD.CaseId = COD.CaseId 
        --INNER JOIN Court CR ON CD.CourtId = CR.CourtId 
        INNER JOIN Office OD ON COD.OfficeId = OD.OfficeId 
        LEFT OUTER JOIN CaseStatusChange CSC ON CD.CaseId = CSC.CaseId 
        --WHERE CR.CourtId = CRT.CourtId 
        WHERE OD.OfficeId = O.OfficeId 
        AND 
        (CD.DateOpened BETWEEN @BeginDate AND @EndDate 
         OR 
        CSC.DateReopened BETWEEN @BeginDate AND @EndDate 
        ) 
     )AS OpenCases, 
     (
        SELECT COUNT(DISTINCT CD.CaseId) 
        FROM [Case] CD 
        INNER JOIN CaseOffice COD ON CD.CaseId = COD.CaseId 
        --INNER JOIN Court CR ON CD.CourtId = CR.CourtId 
        INNER JOIN Office OD ON COD.OfficeId = OD.OfficeId 
        LEFT OUTER JOIN CaseStatusChange CSC ON CD.CaseId = CSC.CaseId 
        --WHERE CR.CourtId = CRT.CourtId 
        WHERE OD.OfficeId = O.OfficeId 
        AND 
        (CSC.DateClosed BETWEEN @BeginDate AND @EndDate 
        ) 
     )AS CloseCases 
    FROM [Case] C 
     INNER JOIN [Appointment] A ON C.CaseId = A.CaseId 
     INNER JOIN [Office] O ON A.OfficeId = O.OfficeId 
     INNER JOIN [Court] CRT ON C.CourtId = CRT.CourtId 


    WHERE 
      -- Case was open (or reopened) during the date range 
      C.DateOpened BETWEEN @beginDate AND @endDate 
      OR 
      C.CaseId IN (SELECT CaseId FROM CaseStatusChange WHERE DateReopened BETWEEN @beginDate AND @endDate) 
      AND 
      -- Office had an appointment sometime during the date range 
      A.DateOn < @endDate AND (A.DateOff IS NULL OR A.DateOff BETWEEN @beginDate AND @endDate) 

      GROUP BY C.CaseId, O.OfficeId, CRT.CourtId, 
     (
       SELECT OfficeId, SUM(CaseCount)AS Counts 
       FROM (
          SELECT COUNT(C.CaseId) AS CaseCount,O.OfficeId 
          FROM [Case] C 
           INNER JOIN [Appointment] A ON C.CaseId = A.CaseId 
           INNER JOIN [Office] O ON A.OfficeId = O.OfficeId 
          WHERE C.DateCreated <= @BeginDate 
           AND C.CaseId NOT IN (SELECT CaseId FROM CaseStatusChange CSC WHERE CSC.DateClosed < @BeginDate) 
          --GROUP BY O.OfficeId 

          UNION 

          -- 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, O.OfficeId 
            FROM [Case] C 
            INNER JOIN [CaseStatusChange] CSC ON C.CaseId = CSC.CaseId 
            INNER JOIN [Appointment] A ON C.CaseId = A.CaseId 
            INNER JOIN [Office] O ON A.OfficeId = O.OfficeId 
            WHERE CSC.DateReopened <= @BeginDate 
            --GROUP BY C.CaseId, O.OfficeID 
           ) AS ReOpened 
          WHERE ReOpened.CaseId NOT IN 
           (
            SELECT CaseId FROM CaseStatusChange 
            WHERE CaseId = ReOpened.CaseId AND 
            CaseStatusChange.DateClosed BETWEEN ReOpened.DateReopened AND @BeginDate 
           ) 
          GROUP BY ReOpened.OfficeId 
         ) AS OpenCasesCount 
       GROUP BY OfficeId 
     ) 
) 
CaseOfficeAppointment 
INNER JOIN [Case] C ON CaseOfficeAppointment.CaseId = C.CaseId 
INNER JOIN [Office] O ON CaseOfficeAppointment.OfficeId = O.OfficeId 
INNER JOIN [CaseType] CT ON C.CaseTypeId = CT.CaseTypeId 
INNER JOIN [Court] CR ON C.CourtId = CR.CourtId 
+0

現在一般回答,但我們知道服務器(SQL服務器,Oracle,MySQL和等)的類型,甚至可能消費客戶機( .NET,Java,PHP等)可能會改變答案。 – 2011-06-10 15:55:58

+0

你想要什麼結果?加入由2個程序產生的結果集? – a1ex07 2011-06-10 15:56:45

+0

@ a1ex07我試圖返回如下結果: 根據日期範圍(beginDate和endDate)返回每個辦公室打開的所有案例,我也想返回基於begindate和之前的開放案例的數量爲每個辦公室。 – Masriyah 2011-06-10 16:04:27

回答

0

如果我理解你的權利,你需要的東西,如:

CREATE PROCEDURE new_proc 
AS 
BEGIN 
    DECLARE @tmp_proc1 TABLE (// list all fields your first procedure returns); 
    DECLARE @tmp_proc2 TABLE (// list fields that your second SP returns); 
    INSERT INTO @tmp_proc1 
     EXECUTE Your_First_Procedure ; 
    INSERT INTO @tmp_proc2 
     EXECUTE Your_Second_Procedure; 

    // Finally, join data in @tmp_proc1 and @tmp_proc2 
    //(you probably need FULL JOIN) and return 1 resultset 

END; 
+0

我相信這是更多我正在尋找。我會放棄這一點,看看結果如何,並讓你知道。謝謝a1ex07! – Masriyah 2011-06-10 16:23:48

0

只要你調整頁眉添加所需的所有參數,你可以根據需要儘可能多的結果集添加到存儲過程。消費的多個表會根據語言和平臺使用的是消費數據,而僅僅是由於一個存儲過程設置成其他應做工精細,除非在底層數據存儲的限制(數據庫服務器?)。

增加: 根據您的迴應,您可以合併兩個結果集在一個單一的存儲過程。爲了消費這個,你有各種選擇。使用讀取器,您可以轉到下一個結果集,因爲它是流水遊標。但是,使用類似DataSet的東西可能會更容易,並且可以通過存儲過程生成它。然後可以使用表格適配器來填充存儲過程中的數據集。兩個表格現在應該填寫一個電話。

這是否有意義?

+0

我使用的SQL Server 2008在我的asp.net應用程序的MVC/C# - 我想合併計算所有的情況下打開了指定日期範圍內每個單獨的辦公室。同時我正在計算所有打開的案例的基礎上,將顯示在該日期和之前開放的案例,並將返回每個辦公室的結果。 – Masriyah 2011-06-10 16:02:47

相關問題