#sql-server
#sql-сервер
Вопрос:
Table :tbl_user
dateofregistration ID registrationstate
6-03-11 3 0
6-03-11 1 0
6-03-11 2 1
7-03-11 2 1
7-03-11 1 1
как я могу отобразить подобный результат для sql server 2008 express
date TotalID(count) Total State(0 only)
6-03-11 3 2
7-03-11 2 0
Я пробовал с этим
SELECT CONVERT(varchar(10), dateofregistration, 103) AS Date,
(select COUNT(ID)) AS Subbase,
(Select Count(ID)from tbl_User where (registrationstate='0')) AS Totalchurn
FROM tbl_User
GROUP BY CONVERT(varchar(10), dateofregistration, 103);
но неверный результат.Любая помощь, пожалуйста.
Ответ №1:
Как насчет;
select
cast(dateofregistration as date),
count(distinct id), --or * for all
sum(
case registrationstate when '0' then 1 else 0 end
)
from tbl_user
group by cast(dateofregistration as date)
order by 1
2011-06-03 3 2
2011-07-03 2 0
Ответ №2:
SELECT CONVERT(varchar(10), dateofregistration, 103) AS Date,
COUNT(1) AS Subbase,
SUM(CASE WHEN registrationstate='0' THEN 1 ELSE 0 END) AS Totalchurn
FROM tbl_User
GROUP BY CONVERT(varchar(10), dateofregistration, 103)
ORDER BY 1
Комментарии:
1. Вам не хватает закрывающего паритета для
END
дляCASE
Ответ №3:
Вы были почти на месте. Вам не нужен дополнительный выбор для COUNT (ID), поскольку это обрабатывается GROUP BY. Вы группируете по дате, и поэтому подсчет будет представлять собой количество идентификаторов в пределах каждой даты. Я сделал счетчик различным, на всякий случай, если у вас может быть несколько регистраций одного и того же идентификатора в один день.
Ваш подзапрос был почти правильным — его нужно сопоставить с основным запросом, выбрав строки с одинаковой датой регистрации.
SELECT CONVERT(varchar(10), dateofregistration, 103) AS Date,
COUNT(DISTINCT ID) AS TotalID,
(Select Count(*) from tbl_User t2 where (registrationstate='0') AND t2.registrationdate=t1.registrationdate) AS Totalchurn
FROM tbl_User t1
GROUP BY CONVERT(varchar(10), dateofregistration, 103);