如何使用group by查询具有两个条件的同一表的两列

时间:2011-04-16 14:14:19

标签: sql-server

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

但错误的结果。任何帮助PLZ。

3 个答案:

答案 0 :(得分:0)

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 :(得分:0)

你快到了。您不需要COUNT(ID)的子选择,因为它由GROUP BY处理。您按日期分组,因此计数将是每个日期内的ID数。我已将计数区分开来,以防您在一天内可以多次注册相同的ID。

您的子查询几乎是正确的 - 它需要通过选择具有相同注册日期的行与主查询相关联。

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

答案 2 :(得分:0)

怎么样;

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