我需要创建一个聚合函数来用于汇总数据。
如果列中超过 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
开头,但找不到如何实现。
提前致谢。
除了上面的注释之外,它也不起作用,因为你不能以这种方式传递列名。 如果您传递@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;