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子句中。我会重新设计我所拥有的,看看我还能做些什么。谢谢