SQL

如何调用用户定义函数以与select,group by,order by一起使用?

发布于 2021-05-10 20:44:28

我有Table1,我需要让它看起来像Table2:

表格1

VisitingCount |  Date
-----------------------
      1       |  15:09
      3       |  15:10
      7       |  15:15
      1       |  15:39
      2       |  15:40
      3       |  15:47

表2

VisitingCount |  Date
-----------------------------
     11       |  15:00-15:30
     6        |  15:30-16:00

我编写了这样的sql用户定义函数:

create FUNCTION [dbo].[fn_GetActivityLogsArranger] (@time AS nvarchar(max))
RETURNS nvarchar(max)
AS
BEGIN
    declare @Return varchar(30)

    select @Return = 
        case 
            when @time between '15:00' and '15:30' then '15:00-15:30'
            when @time between '15:30' and '16:00' then '15:30-16:00'
            when @time between '16:00' and '16:30' then '16:00-16:30'
            when @time between '16:00' and '16:30' then '16:00-16:30' 
            when @time between '16:30' and '17:00' then '16:30-17:00' 
            when @time between '17:00' and '17:30' then '17:00-17:30' 
            when @time between '17:30' and '18:00' then '17:30-18:00'
            else 'Unknown'
        end

    return @Return
end

在我的sql查询中调用UDF时,我获得了正确的结果:

select 
        Count(Page) as VisitingCount,
        dbo.fn_GetActivityLogsArranger(CONVERT(VARCHAR(5),Date, 108))
            as [Time] 
    from 
        scr_SecuristLog     
    where 
        Date between '2009-04-30' and '2009-05-02' AND
        [user] in
        (
            select USERNAME               
            from scr_CustomerAuthorities 
            where customerID = Convert(varchar,4) and ID = Convert(varchar,43) 
        )    
    group by 
        dbo.fn_GetActivityLogsArranger(CONVERT(VARCHAR(5),Date, 108))
    order by 
        dbo.fn_GetActivityLogsArranger(CONVERT(VARCHAR(5),Date, 108)) asc

但是我不喜欢这种方法。我梦dream以求的代码如下所示:

select 
        Count(Page) as VisitingCount,
        dbo.fn_GetActivityLogsArranger(CONVERT(VARCHAR(5),Date, 108))
            as **[TIME]**
    from 
        scr_SecuristLog     
    where 
        Date between '2009-04-30' and '2009-05-02' and 
        user] in
        (
            select USERNAME               
            from scr_CustomerAuthorities 
            where customerID = Convert(varchar,4) and ID = Convert(varchar,43) 
        )    
    group by **[TIME]** 
    order by **[TIME]** asc
关注者
0
被浏览
48
1 个回答
  • 面试哥
    面试哥 2021-05-10
    为面试而生,有面试问题,就找面试哥。

    您可以像视图一样加入表并在其中调用函数。这样,您可以在视图的列上调用分组依据和排序依据。

    select
        Count(Page) as VisitingCount,
        [Time]
    from
    (
        SELECT
            Page,
            Date,
            [user],
            dbo.fn_GetActivityLogsArranger(CONVERT(VARCHAR(5),Date, 108)) as [Time]
        FROM
            scr_SecuristLog
    ) scr_SecuristLog2
    where
        Date between '2009-04-30' and '2009-05-02'
    and
        [user] in
    (
        select
            USERNAME
        from
         scr_CustomerAuthorities
        where
            customerID=Convert(varchar,4)
        and
            ID=Convert(varchar,43)
    )
    group by
        [Time]
    order by
        [Time] asc
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看