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

我有一个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       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的版本。