0

複数の値列を持つテーブルがあります。値は整数または 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

各列の 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' が無効です。何が問題なのか、それとももっと良い方法がありますか?ありがとう

4

1 に答える 1

0

bummi が言うように、CASE を使用すると関数を記述できます。

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 が言うように、これを行いたいということは、テーブルの設計が間違っていることを意味する可能性があります。

于 2013-10-14T12:07:58.633 に答える