SELECT with count(*)子句

时间:2014-06-23 13:00:42

标签: sql oracle

我的数据库表:

//TABLE1
tname       
-----------
brazil     
spain       
england    

在我的表2中:

//Table2
title      date
-------------------------
 test1      15-jun-2012
 test2      16-jun-2012
 test3      14-AUG-2011

在我的表3中:

//Table3
Tname      title
------------------
 brazil     test1
 brazil     test2
 spain      test3

我的问题是找到自2012年以来发生的tname,即2012年1月1日

所以我的查询是

 select tname,
        NVL(count(*),0) as total 
   from table1 t1 
  inner join table3 t3 
     on t1.tname = t3.tname 
  inner join table2 t2 
     on t3.title = t2.title
  where (TO_CHAR(date,'yyyy-mm-dd') > '2012-01-01');

预期产出:

//result
tname        total
-------------------
 brazil        2
 spain         0
 england       0

2 个答案:

答案 0 :(得分:2)

您需要group by子句:

 select tname, NVL(count(*),0) as total
 from table1 t1 inner join
      table3 t3 
      on t1.tname = t3.tname inner join
      table2 t2
      on t3.title = t2.title
 where (TO_CHAR(date,'yyyy-mm-dd') > '2012-01-01')
 group by tname;

这假定查询的其余部分是正确的。

答案 1 :(得分:0)

日期的字符串比较通常不会产生您真正想要的结果。 并且需要group by或者应该返回oracle的语法错误。

SELECT tname,NVL(count(*),0) as total 
FROM  table1 t1 
INNER JOIN table3 t3 
   on t1.tname = t3.tname 
inner join table2 t2 
   on t3.title = t2.title
where date > to_date('2012-01-01','yyyy-mm-dd')
GROUP BY tname;