多个子查询

时间:2012-02-29 10:27:21

标签: sql sql-server sql-server-2000

是否可以从相同的表日期记录中获得如下结果:

               Enrolled   Enrolled as Email  Enrolled as Text Deals Redeemed   
<First Date>   7          5                  2                6
<Next Date>    9          3                  6               14

表结构如下所示:

Customer_id, field1, field2, responsecode, created_date

我当前的查询是这样的:

Select 
   Created,
   Enroll = (Select COUNT(*) from tblCustomer where field1 <> '' group by created),
   Email = (Select COUNT(field1) from tblCustomer where field1 = 'E-mail' and field1     <>    '' group by created),
   Cell = (Select COUNT(*) from tblCustomer where field1 = 'Cell Phone' and field1 <> ''    group by created)
from tblCustomer 
group by created 
order by created

2 个答案:

答案 0 :(得分:3)

你不想要一个COUNT(),而是一个SUM(CASE / WHEN)

Select 
      Created, 
      count(*) TotalCnt,
      SUM( CASE WHEN Field1 = 'E-mail' then 1 else 0 END ) as EMailCnt,
      SUM( CASE WHEN Field1 = 'Cell Phone' then 1 else 0 END ) as CellCnt,
      SUM( CASE WHEN RedeamedCondition then 1 else 0 END ) as RedeamCnt
   from 
      tblCustomer  
   group by 
      created  
   order by 
      created 

注意......如果创建日期/时间,则需要根据&#34;创建&#34;的日期部分来获取组,否则您将获得每秒不同的计数。从另一篇文章中,以下内容仅通过基本删除小时数来获取日期时间的日期部分:分钟:秒部分

DATEADD(dd, 0, DATEDIFF(dd, 0, created)) 

或者如果这没有意义,你可以通过

来做
datepart( yy, created) as GrpYear,
datepart( mm, created) as GrpMonth,
datepart( dd, created) as GrpDay,  ... rest of columns.....

答案 1 :(得分:2)

尝试:

select created_date,
       count(field1) Enrolled,
       count(case field1 when 'E-mail' then 1 end) Enrolled_as_Email,
       count(case field1 when 'Cell Phone' then 1 end) Enrolled_as_Cell,
       (Select COUNT(*)
        from tbl_TransactionDishout d
        where d.created = c.created_date and
              d.DishoutResponseCode = '0000') Deals_Redeemed
from tblCustomer c
group by created_date
order by created_date