【问题标题】:Row level sum of values行级别的值总和
【发布时间】:2013-12-23 10:07:02
【问题描述】:

我有一个 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 实现?

【问题讨论】:

  • 你有什么尝试吗?您如何获得Total Open?打开的日期值是否为空?
  • 可以使用COUNT(column_name)获取记录数。类似SELECT COUNT(BugId) FROM your_table。 count 函数将给出满足条件的非空列的数量。 http://technet.microsoft.com/en-us/library/ms175997.aspx 。让你开始的东西。
  • 哪个 SQL Server 版本?

标签: sql sql-server tsql aggregate-functions


【解决方案1】:

这样的事情应该可以解决问题:

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

现场示例:http://sqlfiddle.com/#!6/de05f/15

【讨论】:

【解决方案2】:

您可以在 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 语句只计算某些行。

【讨论】:

  • @huMptyduMpty 是的,应该可以,为什么你发现它有什么问题,请随时编辑我的帖子,我一点也不介意 :)
  • @M.Ali:不正确。如果您一天没有打开任务,但您关闭了任务,则不算。
  • @M.Ali:应该类似于CASE WHEN ...
  • 欢呼@huMptyduMpty 感谢您指出它现在已修复。
  • @M.Ali:没错。如果您在 2013.12.08 打开了一个任务,并且您将在 2013.12.15 关闭,则您必须有两行。第一个计数器 = 1,第二个计数器 = 1。在你的情况下,你只有一行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-05-14
  • 1970-01-01
  • 1970-01-01
  • 2012-09-21
  • 1970-01-01
  • 2019-10-07
  • 1970-01-01
相关资源
最近更新 更多