Сравнить значение строк

#sql-server

#sql-сервер

Вопрос:

 ID  mobileno    dateofregistration        registrationstate
44  1674174925  2011-04-18 10:17:30.670     0
45  1677864168  2011-04-18 10:20:22.450     1
46  1677864161  2011-04-18 20:47:35.293     0
47  1674174925  2011-04-19 09:28:55.200     1
48  1674174925  2011-04-19 09:28:56.200     0
49  1674174925  2011-04-19 09:28:57.200     1
50  1674174925  2011-04-18 10:17:30.670     0
51  1677864168  2011-04-18 10:20:22.450     1
52  1677864161  2011-04-20 20:47:35.293     0
53  1674174925  2011-04-22 09:28:55.200     1
54  1674174925  2011-04-28 09:28:56.200     0
55  1674174925  2011-04-28 09:28:57.200     1
  

Моя проблема в том, как подсчитать строки со следующими условиями:

registrationstate = 1 и datediff(day,dateofregistration) > 30 для отдельного мобильного номера.

Здесь результатом будет 1

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

1. Что вы подразумеваете под «результатом будет 1»? «1» чего?? Что вы ищете — количество мобильных устройств нет. которые соответствуют этим критериям (я получаю за это 2 …..) или что??? Вообще непонятно…..

Ответ №1:

прежде всего, datediff требуется 3 аргумента

 DATEDIFF ( datepart , startdate , enddate )
  

Я предполагаю, что вы хотите сравнить с сегодняшней датой, поэтому вы можете использовать getdate()

 select * from yourtable
where registrationstate = 1
and datediff( day, dateofregistration,  getdate() ) > 30
  

если getdate() вернуть 2011-05-04 , вы получите следующий вывод

 ------------------------------------------------------------
ID  mobileno    dateofregistration        registrationstate
------------------------------------------------------------
45  1677864168  2011-04-18 10:20:22.450     1
47  1674174925  2011-04-19 09:28:55.200     1
49  1674174925  2011-04-19 09:28:57.200     1
51  1677864168  2011-04-18 10:20:22.450     1
53  1674174925  2011-04-22 09:28:55.200     1
55  1674174925  2011-04-28 09:28:57.200     1
------------------------------------------------------------
  

теперь вы хотите сгруппировать результаты по mobileno , а также вернуть количество строк в группе. Вы можете использовать COUNT(*) агрегатную функцию для возврата количества строк в группе

 select COUNT(*) as total, mobileno from yourtable
where registrationstate = 1
and datediff( day, dateofregistration,  getdate() ) > 30
group by mobileno
  

вы получите следующий вывод

 ------------------------------------------------------------
mobileno      total
------------------------------------------------------------
1677864168    2
1674174925    4
------------------------------------------------------------