Oracle SQL有助于以两种不同的方式计算同一事物,但有共同的分组
我有一个表,每个条目都包含一个事件id、状态(比如打开或关闭)、日期、提出日期和结束日期 我想显示一个统计在关闭日期关闭的事件数的表,以便status='closed'和closed_date处的事件\u id计数不为空,以及在同一天status='open'处的事件\u id计数保持打开的事件数 如果我把你弄糊涂了,一张像这样的桌子:Oracle SQL有助于以两种不同的方式计算同一事物,但有共同的分组,sql,oracle,Sql,Oracle,我有一个表,每个条目都包含一个事件id、状态(比如打开或关闭)、日期、提出日期和结束日期 我想显示一个统计在关闭日期关闭的事件数的表,以便status='closed'和closed_date处的事件\u id计数不为空,以及在同一天status='open'处的事件\u id计数保持打开的事件数 如果我把你弄糊涂了,一张像这样的桌子: ______________________________________________________________________________
______________________________________________________________________________
| closure date | count of incidents closed | count of incidents remaining open |
|--------------|---------------------------|-----------------------------------|
| 01-Sep-12 | 5 | 14 |
| ... | ... | ... |
SELECT COUNT(incident_id)
WHERE closure_date IS NOT NULL AND status="open"
GROUP BY closure_date
SELECT
closure_date,
SUM(CASE WHEN status="open"
THEN 1 ELSE 0 END) AS "count of incidents open",
SUM(CASE WHEN status="closed"
THEN 1 ELSE 0 END) AS "count of incidents closed"
FROM YourTable
WHERE closure_date IS NOT NULL
GROUP BY closure_date
SELECT t1.closure_date, COUNT(t1.incident_id)
, ( SELECT COUNT(t2.incident_id) FROM incident_table t2
WHERE t2.status = 'open'
AND t2.raised_date < t1.closure_date )
FROM incident_table t1
WHERE t1.closure_date IS NOT NULL
AND t1.status = 'closed'
GROUP BY t1.closure_date
我管理了一个表,该表可以计算这样结束的事件数:
______________________________________________________________________________
| closure date | count of incidents closed | count of incidents remaining open |
|--------------|---------------------------|-----------------------------------|
| 01-Sep-12 | 5 | 14 |
| ... | ... | ... |
SELECT COUNT(incident_id)
WHERE closure_date IS NOT NULL AND status="open"
GROUP BY closure_date
SELECT
closure_date,
SUM(CASE WHEN status="open"
THEN 1 ELSE 0 END) AS "count of incidents open",
SUM(CASE WHEN status="closed"
THEN 1 ELSE 0 END) AS "count of incidents closed"
FROM YourTable
WHERE closure_date IS NOT NULL
GROUP BY closure_date
SELECT t1.closure_date, COUNT(t1.incident_id)
, ( SELECT COUNT(t2.incident_id) FROM incident_table t2
WHERE t2.status = 'open'
AND t2.raised_date < t1.closure_date )
FROM incident_table t1
WHERE t1.closure_date IS NOT NULL
AND t1.status = 'closed'
GROUP BY t1.closure_date
我已经试了几个小时让另一个计数工作,但到目前为止还不能:-
编辑:以下是我的表格示例:
___________________________________________________
| incident_id | status | date_raised | closure_date |
|-------------|--------|-------------|--------------|
| 1 | closed | 01-Sep-12 | 01-Sep-12 |
| 2 | open | 30-Aug-12 | (null) |
| 3 | open | 02-Sep-12 | (null) |
| 4 | closed | 02-Sep-12 | 05-Sep-12 |
| ... | ... | ... | ... |
我将向各位介绍:
______________________________________________________________________________
| closure date | count of incidents closed | count of incidents remaining open |
|--------------|---------------------------|-----------------------------------|
| 01-Sep-12 | 1 | 1 |
| 05-Sep-12 | 1 | 2 |
您应该尝试以下方法:
______________________________________________________________________________
| closure date | count of incidents closed | count of incidents remaining open |
|--------------|---------------------------|-----------------------------------|
| 01-Sep-12 | 5 | 14 |
| ... | ... | ... |
SELECT COUNT(incident_id)
WHERE closure_date IS NOT NULL AND status="open"
GROUP BY closure_date
SELECT
closure_date,
SUM(CASE WHEN status="open"
THEN 1 ELSE 0 END) AS "count of incidents open",
SUM(CASE WHEN status="closed"
THEN 1 ELSE 0 END) AS "count of incidents closed"
FROM YourTable
WHERE closure_date IS NOT NULL
GROUP BY closure_date
SELECT t1.closure_date, COUNT(t1.incident_id)
, ( SELECT COUNT(t2.incident_id) FROM incident_table t2
WHERE t2.status = 'open'
AND t2.raised_date < t1.closure_date )
FROM incident_table t1
WHERE t1.closure_date IS NOT NULL
AND t1.status = 'closed'
GROUP BY t1.closure_date
在我看来,对于每个日期,您都希望获得迄今为止已关闭的问题的数量,以及在该日期之前提出的尚未解决的问题的数量,对吗?所以你可能想要这样的东西:
______________________________________________________________________________
| closure date | count of incidents closed | count of incidents remaining open |
|--------------|---------------------------|-----------------------------------|
| 01-Sep-12 | 5 | 14 |
| ... | ... | ... |
SELECT COUNT(incident_id)
WHERE closure_date IS NOT NULL AND status="open"
GROUP BY closure_date
SELECT
closure_date,
SUM(CASE WHEN status="open"
THEN 1 ELSE 0 END) AS "count of incidents open",
SUM(CASE WHEN status="closed"
THEN 1 ELSE 0 END) AS "count of incidents closed"
FROM YourTable
WHERE closure_date IS NOT NULL
GROUP BY closure_date
SELECT t1.closure_date, COUNT(t1.incident_id)
, ( SELECT COUNT(t2.incident_id) FROM incident_table t2
WHERE t2.status = 'open'
AND t2.raised_date < t1.closure_date )
FROM incident_table t1
WHERE t1.closure_date IS NOT NULL
AND t1.status = 'closed'
GROUP BY t1.closure_date
嗯,事实上不太清楚,也许:你的表的主键是什么?事故识别码?意味着事件不能有两种状态?或也许真正的表结构或一些示例数据会有所帮助…@Raphael incident_id是主键。该表包含事件id、提出日期、结束日期和状态。因此,如果状态为“打开”,则关闭日期将为空。如果状态为关闭,则将有一个关闭日期。下面的解决方案没有显示给定关闭日期当天或之前的开放事件数量,但显示了关闭日期上的关闭数量date@RaphaëlAlthaus我在问题中添加了一个数据示例表OK,编辑了我的答案,应该会更好。顺便说一下,我删除了闭包日期不是空测试,因为我认为关闭状态意味着关闭日期不是空的,而是关闭的,但是打开计数不仅需要状态=“打开”,而且还需要以某种方式提出的日期<[集团的关闭日期],我不知道这是否可能:-S@BenHill对完成。哦,好吧,烧焦了;不幸的是,你被打败了但我离得很近@本希尔,如果你觉得我的回答有帮助的话,也请投赞成票。谢谢我一到15点就来P