MEDIAN Function

04/07/2008 - 08:22 von Marius | Report spam
Guten Tag,

vielleicht kann mir ja hierbei jemand unter die Arme greifen.
Ich möchte diese Funktion dynamisch nutzen.

ALTER FUNCTION dbo.Median
(
@TableName nvarchar(128) = 'Test',
@TableField nvarchar(128) = 'ID2',
@InputStyle INT = 1
)
RETURNS FLOAT
AS

BEGIN
DECLARE @Items INT
DECLARE @Low INT
DECLARE @High INT
DECLARE @Values TABLE (ID INT IDENTITY(0, 1) PRIMARY KEY CLUSTERED,
Value INT)

IF @InputStyle = 1 -- Ordinary MEDIAN
INSERT @Values
(
Value
)
SELECT DISTINCT @TableField FROM @TableName ORDER BY @TableField

ELSE -- Distinct MEDIAN
INSERT @Values
(
Value
)
SELECT @TableField FROM @TableName ORDER BY @TableField

SELECT @Items = @@ROWCOUNT

IF @Items % 2 = 0 -- Even number of values
SELECT @High = @Items / 2,
@Low = @High - 1
ELSE -- Odd number of values
SELECT @High = @Items / 2,
@Low = @High

RETURN 1.0 * (SELECT AVG(Value) FROM @Values WHERE ID IN (@Low, @High))
END

Leider bekomme ich immer die Fehlermeldung ich muss @TableName Declarieren.
Leider hilft aber auch das nicht.

Bin für jeden Tipp dankbar.

Danke
Mit freundlichen Grüßen
Marius
 

Lesen sie die antworten

#1 Christa Kurschat
04/07/2008 - 14:16 | Warnen spam
Hallo Marius,

Kommentar im Code.

"Marius" schrieb im Newsbeitrag
news:
Guten Tag,

vielleicht kann mir ja hierbei jemand unter die Arme greifen.
Ich möchte diese Funktion dynamisch nutzen.

ALTER FUNCTION dbo.Median
(
@TableName nvarchar(128) = 'Test',
@TableField nvarchar(128) = 'ID2',
@InputStyle INT = 1
)
RETURNS FLOAT
AS

BEGIN
DECLARE @Items INT
DECLARE @Low INT
DECLARE @High INT
DECLARE @Values TABLE (ID INT IDENTITY(0, 1) PRIMARY KEY CLUSTERED,
Value INT)

IF @InputStyle = 1 -- Ordinary MEDIAN
INSERT @Values
(
Value
)
SELECT DISTINCT @TableField FROM @TableName ORDER BY @TableField




Das geht so nicht.
Ginge nur mit dyn. SQL. Ob das inzwischen allerdings in Funktionen erlaubt
ist, weiß ich nicht.

ELSE -- Distinct MEDIAN
INSERT @Values
(
Value
)
SELECT @TableField FROM @TableName ORDER BY @TableField

SELECT @Items = @@ROWCOUNT

IF @Items % 2 = 0 -- Even number of values
SELECT @High = @Items / 2,
@Low = @High - 1
ELSE -- Odd number of values
SELECT @High = @Items / 2,
@Low = @High

RETURN 1.0 * (SELECT AVG(Value) FROM @Values WHERE ID IN (@Low, @High))
END

Leider bekomme ich immer die Fehlermeldung ich muss @TableName
Declarieren.
Leider hilft aber auch das nicht.




Ich fürchte, das kannst Du so nicht machen.
Du willst eine Funktion, die für alle Tabellen anwendbar ist, einen
Alleskönner.
Sowas ist meist keine gute Idee.

Gruß
Christa
Access-FAQ: http://www.donkarl.com
SQL-Server-FAQ: www.sqlfaq.de
InsideSql: www.insidesql.org

Ähnliche fragen