СОЮЗ в хранимых процедурах COUNT - PullRequest
0 голосов
/ 08 июня 2011

Я создаю хранимую процедуру, которая будет возвращать результаты открытых дел на основе введенного времени - я хочу вернуть количество дел, но на основе разных офисов. После редактирования своего кода я также переформулирую свой вопрос по-другому - каким способом лучше всего возвращать счетчик вместо фактических результатов, которые я получаю сейчас.

Вот моя хранимая процедура:

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
)

Ответы [ 2 ]

2 голосов
/ 08 июня 2011

Это означает, что количество столбцов в списках SELECT должно совпадать. И их типы данных тоже.

Как это:

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

В вашем конкретном случае вам нужно добавить OfficeID и счет во второй список SELECT.

1 голос
/ 08 июня 2011

Обновление: чтобы включить 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
...