SQL-是否通过子选择进行分组?

SQL-是否通过子选择进行分组?,sql,Sql,我有以下疑问: SELECT COUNT(DATEPART(hh, CallStart)), DATEPART(hh, CallStart) as 'Hour' FROM PhoneSystemLog WHERE MONTH(CallStart) = @Month and YEAR(CallStart) = @Year GROUP BY DATEPART(hh, CallStart) 这很好,它会将每小时的通话次数分组,但我想做的是将上午12点到7点之间的通话分组,然后将下午6点到

我有以下疑问:

SELECT COUNT(DATEPART(hh, CallStart)), DATEPART(hh, CallStart) as 'Hour'
  FROM PhoneSystemLog 
 WHERE MONTH(CallStart) = @Month and YEAR(CallStart) = @Year 
 GROUP BY DATEPART(hh, CallStart)

这很好,它会将每小时的通话次数分组,但我想做的是将上午12点到7点之间的通话分组,然后将下午6点到12点之间的通话分组,因为在这些时间拨打的电话不多,所以在这些时间里,每小时拨打的电话次数似乎没有意义(因为它们不在营业时间)。这可能吗?

试试这样的方法

select count(DATEPART(hh, CallStart)), 
    CASE 
    when DATEPART(hh, callstart) between 0 to 7 then '12:00AM-7AM'
    when DATEPART(hh, callstart) between 18 to 23 then '06PM-12AM'
    END
as 'hour' from PhoneSystemLog  
where MONTH(callstart) = @Month and YEAR(callstart) = @Year  
group by 
    CASE 
    when DATEPART(hh, callstart) between 0 to 7 then '12:00AM-7AM'
    when DATEPART(hh, callstart) between 18 to 23 then '06PM-12AM'
    END

试试这样的

select count(DATEPART(hh, CallStart)), 
    CASE 
    when DATEPART(hh, callstart) between 0 to 7 then '12:00AM-7AM'
    when DATEPART(hh, callstart) between 18 to 23 then '06PM-12AM'
    END
as 'hour' from PhoneSystemLog  
where MONTH(callstart) = @Month and YEAR(callstart) = @Year  
group by 
    CASE 
    when DATEPART(hh, callstart) between 0 to 7 then '12:00AM-7AM'
    when DATEPART(hh, callstart) between 18 to 23 then '06PM-12AM'
    END

您可以使用
案例
将小时转换为时段:

select  Period
,       count(*) as Calls
from    (
        select  case 
                when datepart(hh, CallStart) between 0 and 7 then '1-7'
                when datepart(hh, CallStart) between 18 and 23 then '18-24'
                else cast(datepart(hh, CallStart) as varchar(2))
                end as Period
        from    PhoneSystemLog
        where   MONTH(CallStart) = @Month 
                and YEAR(CallStart) = @Year 
        ) as SubQueryAlias
group by
        Period

您可以使用
案例
将小时转换为时段:

select  Period
,       count(*) as Calls
from    (
        select  case 
                when datepart(hh, CallStart) between 0 and 7 then '1-7'
                when datepart(hh, CallStart) between 18 and 23 then '18-24'
                else cast(datepart(hh, CallStart) as varchar(2))
                end as Period
        from    PhoneSystemLog
        where   MONTH(CallStart) = @Month 
                and YEAR(CallStart) = @Year 
        ) as SubQueryAlias
group by
        Period

+1表示不必在select和group by中重复大小写。@BiffBaffBoff:表示排序,您可以使用(这是sql server语法):=order by cast(当charindex('-',句点,1)>0时的大小写,然后使用子字符串(句点,1,charindex('-',句点,1)-1)否则句点结束为int)+1,因为不必在select和group by中重复大小写。@biffbaffoff:对于排序,您可以使用(这是sql server语法):=按类型转换的顺序(当charindex('-',句点,1)>0时,则为子字符串(句点,1,charindex('-',句点,1)-1),否则句点以int结束)