Stored procedures 存储过程计数中的并集

Stored procedures 存储过程计数中的并集,stored-procedures,Stored Procedures,我正在创建一个存储过程,它将根据输入的时间返回打开案例的结果-我希望返回案例的计数,但基于不同的办公室。在编辑代码之后,我还会重新陈述我的问题——哪种方式最好返回一个计数,而不是我现在得到的实际结果 以下是我的存储过程: SELECT C.CaseId FROM [Case] C WHERE C.DateCreated <= @BeginDate AND C.CaseId NOT IN (SELECT CaseId FROM CaseStatusChange CSC WHERE C

我正在创建一个存储过程,它将根据输入的时间返回打开案例的结果-我希望返回案例的计数,但基于不同的办公室。在编辑代码之后,我还会重新陈述我的问题——哪种方式最好返回一个计数,而不是我现在得到的实际结果

以下是我的存储过程:

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
)

这意味着选择列表中的列数必须匹配。以及它们的数据类型

像这样:

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

在特定情况下,需要在第二个选择列表中添加OfficeID和计数。

这意味着选择列表中的列数必须匹配。以及它们的数据类型

像这样:

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

在您的特定情况下,您需要在第二个选择列表中添加OfficeID和计数。

更新:要根据请求包括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

更新:按要求包括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

是的,在OP的示例中,两个选项是:SELECT C.CaseId、O.OfficeId和SELECT REPOWED.CaseId,它们具有不同数量的参数。在子选项中也有一个偷偷的计数。我编辑了代码,并以不同的方式启动,希望它会忽略一些节点,在OP的示例中,似乎有两个选项:SELECT C.CaseId、O.OfficeId和SELECT responsed.CaseId,它们具有不同数量的参数。在子选项中也有一个偷偷的计数。我编辑了我的代码,并以不同的方式启动,希望这会让一些knotsThank谢谢!再一次,你是最好的。很抱歉,我知道我很痛苦,但我还想为OfficeId添加一个参数,这样我就可以得到每个办公室有多少打开的案例。我是否要将它们添加到内部select语句中?在这种情况下,您需要使用GROUP BY,例如select COUNTC.CaseId作为CaseCount,OfficeID。。。按Office ID分组。。因此,您的结果将是成对的OfficeId和Count。OfficeId是案例表中的一列吗?或者您需要一个连接来获取它吗?这看起来很好,但是当我尝试执行该过程时,我发现reopen.OfficeId无效,并且不包含在聚合函数或Group By子句中。我会重新设计我所拥有的,看看我还能做些什么。谢谢非常感谢。再一次,你是最好的。很抱歉,我知道我很痛苦,但我还想为OfficeId添加一个参数,这样我就可以得到每个办公室有多少打开的案例。我是否要将它们添加到内部select语句中?在这种情况下,您需要使用GROUP BY,例如select COUNTC.CaseId作为CaseCount,OfficeID。。。按Office ID分组。。因此,您的结果将是成对的OfficeId和Count。OfficeId是案例表中的一列吗?或者您需要一个连接来获取它吗?这看起来很好,但是当我尝试执行该过程时,我发现reopen.OfficeId无效,并且不包含在聚合函数或Group By子句中。我会重新设计我所拥有的,看看我还能做些什么。谢谢