我有一个包含多个值列的表。值可以是整数或NULL。示例:
LFNR WertA WertB WertC
1 1 1 2
2 100 100 200
3 NULL 1 NULL
5 1 NULL 1
6 0 0 0
40 NULL 1 NULL我需要得到的平均数,让我们说,前3值为非空的每一列。对于单个列,我使用以下语句获得所需的平均值:
SELECT AVG(WertA) FROM (SELECT TOP 3 WertA FROM synta_rollmw WHERE WERTA IS NOT NULL ORDER BY lfnr DESC)u要在SSRS中使用此值,我的想法是使用如下函数:
SELECT dbo.func_avg_Wert(WertA), dbo.func_avg_Wert(WertB), ...下面是函数的代码:
CREATE FUNCTION dbo.func_avg_Wert (@col_in varchar(15))
RETURNS int
AS
BEGIN
DECLARE @rollmw int
DECLARE @sqlquery VARCHAR(1000)
SET @sqlquery = ('SELECT AVG(@col_in) FROM (SELECT TOP 3 @col_in FROM synta_rollMW WHERE @col_in IS NOT NULL ORDER BY lfnr DESC)u')
EXEC @sqlquery
RETURN @rollmw
END
GO但是如果我尝试使用这个函数,我会得到“列名'WertA‘无效。有什么问题或者有更好的方法吗?谢谢
发布于 2013-10-14 12:07:58
正如bummi所说,使用大小写可以编写函数。
CREATE FUNCTION dbo.func_avg_Wert (@col_in varchar(15))
RETURNS int
AS
BEGIN
DECLARE @A INT;
WITH ColTbl AS
(
SELECT LFNR,
CASE @Col_In
WHEN 'WertA' THEN WertA
WHEN 'WertB' THEN WertB
WHEN 'WertC' THEN WertC
END AS Wert
FROM synta_rollmw
)
SELECT @A = AVG(Wert)
FROM
(
SELECT TOP(3) Wert
FROM ColTbl
WHERE Wert IS NOT NULL
ORDER BY lfnr DESC
)u;
RETURN @A;
END;然后,当您调用它时,需要在列名周围引用:
SELECT dbo.func_avg_Wert('WertA'), dbo.func_avg_Wert('WertB'), dbo.func_avg_Wert('WertC');但是,正如Damien_The_Unbeliever所说,想要这样做很可能意味着你的桌子设计不当。
https://stackoverflow.com/questions/19356771
复制相似问题