首页 > SQLSERVER 自定义函数里的group by里内嵌case when问题

SQLSERVER 自定义函数里的group by里内嵌case when问题

自定义函数拟实现功能:按照固定的入参值以表形式返回分组聚合后的结果.
例如:源表中有三个属性字段,客户,所属省份,所属市,和一个销量字段,通过输入三个参数实现分组聚合后的统计客户+省份的销量/客户+市的销量结果,入参1为客户;2为省/市;3为标识字段2是省还是市的字段。

已试用方法:

①表值函数,通过动态语句拼接,case when 实现select后所需字段、group by 需排序字段,但是编译不成功,查了是函数内不支持动态拼接语句???

②直接使用case when 筛选所需字段,此方法测试时,将sql单拉出来 赋值,执行成功,函数编译成功,但是调用时总是失败。

DECLARE @CustomerId VARCHAR(50)
DECLARE    @ProCity VARCHAR(50)
DECLARE    @deepth    INT
SET @CustomerId='C4E6FE23-D9E7-4C84-B721-098B01C72061'
SET @ProCity='AF2B0EC0-747C-49F2-8F42-9F673AE8A69B'
SET @deepth=1
SELECT t.CustomerId,CASE @deepth
            WHEN 1 THEN t.ProId
            WHEN 2 THEN t.CityId
            END AS factor,
        SUM(t.mount) as Count_All
                CAST(t.CreateDate AS date) as CreateDate
        FROM table t
        WHERE t.CustomerId=@CustomerId
        AND t.ProId=CASE @deepth WHEN 1 THEN @ProCity WHEN 2 THEN t.ProId END
        AND t.CityId=CASE @deepth WHEN 1 THEN t.CityId WHEN 2 THEN @ProCity END
        GROUP BY t.CustomerId,
            CASE @deepth
            WHEN 1 THEN t.ProId
            WHEN 2 THEN t.CityId
            END,
            CAST(t.CreateDate AS date)

编译函数后,调用方法及提示:

SELECT dbo.fn_function('C4E6FE23-D9E7-4C84-B721-098B01C72061','AF2B0EC0-747C-49F2-8F42-9F673AE8A69B',1)

<font color=#FF0000>消息 4121,级别 16,状态 1,第 14 行</font>
<font color=#FF0000>找不到列 "dbo" 或用户定义的函数或聚合 "dbo.fn_function",或者名称不明确。</font>

问题:
① 要在函数内使用动态语句拼接,并返回表值函数,这个可以实现么?
②求排查错误,指点正确方法。


换了WITH 语句还是不行

WITH TMP AS (
SELECT t.CustomerId,CASE @deepth
            WHEN 1 THEN t.ProId
            WHEN 2 THEN t.CityId
            END AS factor,
        count,CAST(t.CreateDate AS date) as CreateDate
        FROM table t
        WHERE t.CustomerId=@CustomerId
        AND t.ProId=CASE @deepth WHEN 1 THEN @ProCity WHEN 2 THEN t.ProId END
        AND t.CityId=CASE @deepth WHEN 1 THEN t.CityId WHEN 2 THEN @ProCity END
)
SELECT CustomerId,
       factor,
       SUM(mount)
       CreateDate
FROM TMP
GROUP BY CustomerId,factor,CreateDate

更正已解,调用函数写错了,好浪费时间...>_<

【热门文章】
【热门文章】