ВЫБЕРИТЕ с помощью предложения count (*)

#sql #oracle

#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
  

мой вопрос заключается в том, чтобы найти tname, которые встречаются с 2012 года, что означает 1 января 2012 года

итак, мой запрос

  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
  

Комментарии:

1. Какой тип данных — дата? сравнение строк на самом деле не то, что вам нужно, не так ли?

Ответ №1:

Вам нужно 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. я не могу протестировать запрос. не знаю почему. но здесь это правильно?

2. @user3664490 … Для меня это выглядит правильно, хотя nvl() это избыточно. count(*) не возвращает NULL .

Ответ №2:

Сравнение строк даты обычно не приводит к тому, что вы действительно хотите. и требуется 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;