创建返回 nvarchar 的用户定义聚合函数

问题描述 投票:0回答:1

我需要创建一个聚合函数来用于汇总数据。

如果列中超过 1 个不同值,该函数基本上应返回“#”;如果列中只有一个不同值,则该函数应返回该值。

到目前为止我尝试的是;

CREATE FUNCTION dbo.my_agg(@mycol NVARCHAR(MAX))
RETURNS NVARCHAR(MAX)
AS
BEGIN
    DECLARE @result NVARCHAR(MAX);

    SELECT @result = CASE
                        WHEN COUNT(DISTINCT @mycol) = 1 THEN MAX(@mycol)
                        ELSE '#'
                    END

    RETURN @result;
END;

然后我意识到用户定义的函数不能在聚合中使用,我需要通过 group by 在分组数据中运行此函数。

我认为定义应该以

CREATE AGGREGATE
开头,但找不到如何实现。

提前致谢。

sql-server t-sql aggregate-functions
1个回答
0
投票

除了上面的注释之外,它也不起作用,因为你不能以这种方式传递列名。 如果您传递@mycol,假设“column1” - 它不会计算 COUNT(DISTINCT column1)。相反,它会计算 COUNT(DISTINCT 'column1') 并且显然总是会给你 1。

它可以通过动态 SQL 来解决,但在这种情况下在 UDF 中是不可能的。

您可以尝试的是在使用查询构建临时表时提前准备所有聚合,然后在主查询中使用其中之一:

SELECT
    column1,
    column2,
    ...
    columnN,
    CASE WHEN COUNT(DISTINCT column1) = 1 THEN MAX(column1) ELSE '#' END AS Aggregation1,
    CASE WHEN COUNT(DISTINCT column2) = 1 THEN MAX(column2) ELSE '#' END AS Aggregation2,
    ...
    CASE WHEN COUNT(DISTINCT columnN) = 1 THEN MAX(columnN) ELSE '#' END AS AggregationN
INTO #Temp
FROM
(
    SELECT -- your initial query
        Something1 AS Column1,
        Something2 AS Column2,
        ...
        SomethingN AS ColumnN
    FROM ...
) q;

DECLARE @myCol VARCHAR(100) = 'column1';

SELECT
    column1,
    column2,
    ...,
    columnN,
    CASE @myCol
        WHEN 'column1' THEN Aggregation1
        WHEN 'column2' THEN Aggregation2
        ...
        WHEN 'columnN' THEN AggregationN
    END AS Aggregation
FROM #Temp;
© www.soinside.com 2019 - 2024. All rights reserved.