首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >T-SQL将列传递给作为参数的函数。

T-SQL将列传递给作为参数的函数。
EN

Stack Overflow用户
提问于 2013-10-14 09:02:19
回答 1查看 4.9K关注 0票数 0

我有一个包含多个值列的表。值可以是整数或NULL。示例:

代码语言:javascript
复制
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值为非空的每一列。对于单个列,我使用以下语句获得所需的平均值:

代码语言:javascript
复制
SELECT AVG(WertA) FROM (SELECT TOP 3 WertA FROM synta_rollmw WHERE WERTA IS NOT NULL ORDER BY lfnr DESC)u

要在SSRS中使用此值,我的想法是使用如下函数:

代码语言:javascript
复制
SELECT dbo.func_avg_Wert(WertA), dbo.func_avg_Wert(WertB), ...

下面是函数的代码:

代码语言:javascript
复制
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‘无效。有什么问题或者有更好的方法吗?谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-10-14 12:07:58

正如bummi所说,使用大小写可以编写函数。

代码语言:javascript
复制
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;

然后,当您调用它时,需要在列名周围引用:

代码语言:javascript
复制
SELECT dbo.func_avg_Wert('WertA'), dbo.func_avg_Wert('WertB'), dbo.func_avg_Wert('WertC');

但是,正如Damien_The_Unbeliever所说,想要这样做很可能意味着你的桌子设计不当。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19356771

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档