Sql 行级值和
我有一个SQL数据Sql 行级值和,sql,sql-server,tsql,aggregate-functions,Sql,Sql Server,Tsql,Aggregate Functions,我有一个SQL数据 BugID Request Date Closed Date -------------------------------- 1234 11/1/2013 11/5/2013 2345 11/1/2013 11/2/2013 2435 11/2/2013 11/2/2013 6345 11/3/2013 11/5/2013 9364 11/5/2013 11/6/2013 我希望结果是正确的 Date
BugID Request Date Closed Date
--------------------------------
1234 11/1/2013 11/5/2013
2345 11/1/2013 11/2/2013
2435 11/2/2013 11/2/2013
6345 11/3/2013 11/5/2013
9364 11/5/2013 11/6/2013
我希望结果是正确的
Date Requested Bugs Closed Bugs Total Open Total Closed
----------------------------------------------------------------
11/1/2013 2 0 2 0
11/2/2013 1 2 3 2
11/3/2013 1 0 4 2
11/5/2013 1 1 5 3
11/6/2013 0 1 5 4
可以通过Transact-SQL吗?您可以在SUM/COUNT函数中使用CASE语句,如下所示
SELECT CAST([Request Date] AS DATE) AS [Request Date]
, COUNT(*) AS [Requested Bugs]
, COUNT(CASE WHEN [Closed Date] IS NOT NULL THEN 1 ELSE NULL END) AS [Closed Bugs]
, COUNT(CASE WHEN [Closed Date] IS NULL THEN 1 ELSE NULL END) AS [Total Open]
FROM Table_Name
GROUP BY CAST([Request Date] AS DATE)
我在这里考虑了一个闭合列,它将指示哪些作业仍然处于打开状态,它可以是一个位字段或其他任何内容,但主要思想是向您展示如何在聚合函数中使用CASE语句来仅对某些行进行计数 您可以在SUM/COUNT函数中使用CASE语句,如下所示
SELECT CAST([Request Date] AS DATE) AS [Request Date]
, COUNT(*) AS [Requested Bugs]
, COUNT(CASE WHEN [Closed Date] IS NOT NULL THEN 1 ELSE NULL END) AS [Closed Bugs]
, COUNT(CASE WHEN [Closed Date] IS NULL THEN 1 ELSE NULL END) AS [Total Open]
FROM Table_Name
GROUP BY CAST([Request Date] AS DATE)
我在这里考虑了一个闭合列,它将指示哪些作业仍然处于打开状态,它可以是一个位字段或其他任何内容,但主要思想是向您展示如何在聚合函数中使用CASE语句来仅对某些行进行计数 像这样的事情应该可以做到:
with allDates (date) as
(
select requestDate from dbo.bugs
union select closedDate from dbo.bugs
)
select date,
(select count(*) from dbo.bugs where requestDate = a.date) as bugsRequested,
(select count(*) from dbo.bugs where closedDate = a.date) as bugsClosed,
(select count(*) from dbo.bugs where a.date between requestDate and closedDate) AS bugsOpen,
(select count(*) from dbo.bugs where closedDate<=a.date) AS totalClosed
from allDates a
活生生的例子:像这样的东西应该可以做到:
with allDates (date) as
(
select requestDate from dbo.bugs
union select closedDate from dbo.bugs
)
select date,
(select count(*) from dbo.bugs where requestDate = a.date) as bugsRequested,
(select count(*) from dbo.bugs where closedDate = a.date) as bugsClosed,
(select count(*) from dbo.bugs where a.date between requestDate and closedDate) AS bugsOpen,
(select count(*) from dbo.bugs where closedDate<=a.date) AS totalClosed
from allDates a
活生生的例子:你试过什么吗?你是怎么打开的?打开的记录的日期值是否为空?您可以使用COUNTcolumn\u name获取记录数。类似于从您的_表中选择COUNTBugId。count函数将给出满足条件的非空列数。让您开始使用的东西。哪个SQL Server版本?您尝试过什么吗?你是怎么打开的?打开的记录的日期值是否为空?您可以使用COUNTcolumn\u name获取记录数。类似于从您的_表中选择COUNTBugId。count函数将给出满足条件的非空列数。让你开始学习的东西。哪个SQL Server版本?@huMptyduMpty yep应该可以,为什么你认为它有什么问题请随意编辑我的帖子我一点也不介意:@M.Ali:不正确。若你们一天内并没有打开任务,但你们已经关闭了任务,那个么你们就不算了。@M.Ali:这应该是一个类似于……cheers@huMptyduMpty感谢你们指出它,现在就解决了。@M.Ali:没错。如果您已在2013.12.08打开任务,并将在2013.12.15关闭,则必须有两行。第一个计数器为1,第二个计数器为1。在你的情况下,你只有一行。@huMptyduMpty-yep应该可以,为什么你认为它有什么问题请随意编辑我的帖子我一点也不介意:@M.Ali:不正确。若你们一天内并没有打开任务,但你们已经关闭了任务,那个么你们就不算了。@M.Ali:这应该是一个类似于……cheers@huMptyduMpty感谢你们指出它,现在就解决了。@M.Ali:没错。如果您已在2013.12.08打开任务,并将在2013.12.15关闭,则必须有两行。第一个计数器为1,第二个计数器为1。在您的情况下,您只有一行。最好避免使用。特别是因为我们不知道SQL Server的版本。最好避免使用。尤其是我们不知道SQL Server的版本。