2015-12-11 35 views
0

空日期我有一个空日期的问题,在甲骨文计数在甲骨文

我有一个表是这样的:

ID DATE 
1  '02/08/2015' 
1  NULL 
1 '02/06/2014' 
2 NULL 
2 '06/02/2013' 

这仅仅是真表的一个例子。现在,我需要的是这样的:

ID DAY_INAC 
1 1 
2 1 

我的意思是,我需要数只存在于DATE列空值。

但是,当我执行我的查询

Select id, count(date) 
from table 
where date is null 
group by Id 
having count(date)>0 

结果我得到什么。我需要用日期值来生成相应的计数。

问候

+2

如果要计算行数,则使用'count(*)'。只有当你需要对所述列不为空的行进行计数时才使用count(somecol) –

+0

@ MT0:它必须是错误的。问题很明显,就是Oracle。我删除了标签。 – sstan

回答

2

COUNT不计算NULL值。您可以使用CASE改变他们:

Select id, count(CASE WHEN date IS NULL THEN 1 END) AS DAY_INAC 
from table 
where date is null 
group by Id; 

LiveDemo

请不要名作为数据类型列。否则,您可能需要引用它们。

+0

你不需要'where date is null' :)只有当你在case表达式上有一个基于函数的索引并且将其重写为'CASE WHEN date IS NULL THEN 1 END = 1'时,它才有用 –

+0

@FlorinGhita我需要。请检查[demo](https://data.stackexchange.com/stackoverflow/query/407437)。OP也有数量(日期)> 0' – lad2025

+0

mmm ...是的,你是对的。如果你省略了“where”,你会得到那些零空日期的。 –

1

一个以上精简查询:

Select id, count(nvl2(date_column,null, sysdate)) as cnt 
from table 
group by Id; 
+0

它将如何与'SQL-SERVER'协同工作? – lad2025

+0

哎呀,没有注意到:) –

+0

为什么它必须使用'SQL-SERVER'?这个问题在文中特别指出了Oracle。 – MT0

4

由于您的查询已经被date is null过滤,您只需要使用count(*)

Select id, count(*) 
from table 
where date is null 
group by Id 
having count(*) > 0 
1

COUNT将不计入NULL值 - 而不是让它来算对于那些行为NULL的文字值(即1):

SQL Fiddle

的Oracle 11g R2架构设置

CREATE TABLE table_name (ID, "DATE") AS 
      SELECT 1, DATE '2015-08-02' FROM DUAL 
UNION ALL SELECT 1, NULL FROM DUAL 
UNION ALL SELECT 1, DATE '2014-06-02' FROM DUAL 
UNION ALL SELECT 2, NULL FROM DUAL 
UNION ALL SELECT 2, DATE '2013-02-06' FROM DUAL 

查询1

SELECT id, 
     COUNT(1) 
FROM table_name 
WHERE "DATE" IS NULL 
GROUP BY id 

Results

| ID | COUNT(1) | 
|----|----------| 
| 1 |  1 | 
| 2 |  1 |