как запросить два столбца одной таблицы с двумя условиями с помощью groupby

#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);