Tag: "entwicklung"

N-te Wurzel einer Zahl

Posted on Aug 3, 2004 von in SQL Server

Tja, wieder so ein Beispiel, dass man mal in der Schule gelernt hat, aber immer genau dann vergisst, wenn man es braucht.

DECLARE @My1 FLOAT
DECLARE @My2 FLOAT

SELECT @My1 = 16, @My2 = 4
SELECT POWER(@My1, 1/@My2)
                                                      
----------------------------------------------------- 
2.0

(1 row(s) affected)

Oder als UDF-Version

CREATE FUNCTION nthroot(@My1 FLOAT, @My2 FLOAT) 
RETURNS FLOAT
	AS
		BEGIN
			RETURN POWER(@My1,1/@My2)
		END
GO
SELECT dbo.nthroot(16,4)
DROP FUNCTION dbo.nthroot
                                                      
----------------------------------------------------- 
2.0

(1 row(s) affected)

Kleinste gemeinsame Vielfache zweier Zahlen

Posted on Aug 3, 2004 von in SQL Server
CREATE FUNCTION dbo.kgv(@zahl1 int, @zahl2 int ) 
RETURNS INT
AS 
  BEGIN
   RETURN (@zahl1 * @zahl2) / dbo.ggt(@zahl1, @zahl2)
  END
 GO

SELECT dbo.kgv(24,36)
DROP FUNCTION dbo.kgv
            
----------- 
72

(1 row(s) affected)

Der Vollständigkeit halber hier noch einmal die Funktion zur Ermittlung des grösssten gemeinsamen Teilers:

CREATE FUNCTION dbo.ggt(@zahl1 int, @zahl2 int) 
RETURNS INT
AS
 BEGIN
   DECLARE @zahl3 INT
   SET @zahl3=1
   WHILE (@zahl3 <> 0)
    BEGIN        
     SET @zahl3=@zahl1 % @zahl2
     SET @zahl1=@zahl2
     SET @zahl2=@zahl3
    END
  RETURN @zahl1
 END
GO

Dies ist dies Adaption der Excel Funktion KGV.

Größte gemeinsame Teiler zweier Zahlen

Posted on Aug 3, 2004 von in SQL Server

Dies ist die Adaption der Excel Funktion GGT().

CREATE FUNCTION dbo.ggt(@zahl1 int, @zahl2 int) 
RETURNS INT
AS
BEGIN
DECLARE @zahl3 INT
SET @zahl3=1
WHILE (@zahl3 <> 0)
BEGIN
SET @zahl3=@zahl1 % @zahl2
SET @zahl1=@zahl2
SET @zahl2=@zahl3
END
RETURN @zahl1
END
GO
SELECT dbo.ggt(24,36)
DROP FUNCTION dbo.ggt

-----------
12

(1 row(s) affected)

Sequentielle Nummerierung eines Resultsets

Posted on Aug 2, 2004 von in SQL Server

Eine beliebte Frage mit unzähligen Antworten. Meine Lieblingsantwort darauf ist, dies in der Präsentationsschicht seiner Anwendung zu machen. IMHO ist dies Aufgabe des Clients, nicht des Servers. Wenn es aber unbedingt in T-SQL gemacht werden soll, kann man folgendes machen:

USE PUBS
GO
SELECT
(
SELECT COUNT(*)
FROM Authors
WHERE au_id <= A.au_id
) AS Lfd_Nr
, au_lname, au_fname
FROM
Authors AS A
ORDER BY
Lfd_Nr
GO

Lfd_Nr au_lname au_fname
----------- ---------------------------------------- --------------------
1 Hello World Johnson
2 Green Marjorie
3 Carson Cheryl
4 O'Leary Michael
5 Straight Dean
6 Smith Meander
7 Bennet Abraham
8 Dull Ann
9 Gringlesby Burt
10 Locksley Charlene
11 Greene Morningstar
12 Blotchet-Halls Reginald
13 Yokomoto Akiko
14 del Castillo Innes
15 DeFrance Michel
16 Stringer Dirk
17 MacFeather Stearns
18 Karsen Livia
19 Panteley Sylvia
20 Hunter Sheryl
21 McBadden Heather
22 Ringer Anne
23 Ringer Albert

(23 row(s) affected)

Bei umfangreichen Resultsets kann die obige Methode schon mal einige Zeit in Anspruch nehmen. Ist also nur bedingt empfehlenswert. Eine Alternative ist vielleicht die Verwendung der IDENTITY Funktion zusammen mit einer temporären Tabelle, so wie hier:

SELECT 
IDENTITY(INT,1,1) AS Lfd_Nr
, au_lname
, au_fname
INTO #authors
FROM authors
ORDER BY au_id

SELECT *
FROM #authors
ORDER BY Lfd_Nr

DROP TABLE #authors

Lfd_Nr au_lname au_fname
----------- ---------------------------------------- --------------------
1 Hello World Johnson
2 Green Marjorie
3 Carson Cheryl
4 O'Leary Michael
5 Straight Dean
6 Smith Meander
7 Bennet Abraham
8 Dull Ann
9 Gringlesby Burt
10 Locksley Charlene
11 Greene Morningstar
12 Blotchet-Halls Reginald
13 Yokomoto Akiko
14 del Castillo Innes
15 DeFrance Michel
16 Stringer Dirk
17 MacFeather Stearns
18 Karsen Livia
19 Panteley Sylvia
20 Hunter Sheryl
21 McBadden Heather
22 Ringer Anne
23 Ringer Albert

(23 row(s) affected)

In SQL Server 2005 ist dies übrigens einfacher durch die Implementierung von ROW_NUMBER().

Fakultät einer Zahl

Posted on Jul 26, 2004 von in SQL Server
CREATE FUNCTION dbo.fakultät(@n DECIMAL(38,0))
RETURNS DECIMAL(38,0)
AS
BEGIN
DECLARE @tmp DECIMAL(38,0)
IF (@n <= 1)
SELECT @tmp = 1
ELSE
SELECT @tmp = @n * dbo.fakultät(@n - 1)
RETURN @tmp
END
GO
SELECT dbo.fakultät(10)
DROP FUNCTION dbo.fakultät

----------------------------------------
3628800

(1 row(s) affected)

Spielt man dieses Spielchen weiter, wird man feststellen, dass man bei Zahlen grösser als 32, folgende Meldung erhält:

Server: Nachr.-Nr. 217, Schweregrad 16, Status 1,  Prozedur fakultät, Zeile 9
Die maximale Schachtelungsebene für .... (Limit ist 32).

Man wird auch feststellen, dass bei Input von 32 eine Abweichung zu Excel existiert.

Steigung einer Geraden

Posted on Jul 26, 2004 von in SQL Server
DECLARE @x1 FLOAT
DECLARE @x2 FLOAT
DECLARE @y1 FLOAT
DECLARE @y2 FLOAT

SELECT @x1 = 1, @x2 = 2, @y1 = 1, @y2 = 2
SELECT (@y2-@y1)/(@x2-@x1)

-----------------------------------------------------
1.0

(1 row(s) affected)

Oder als UDF

CREATE FUNCTION dbo.steigung(@y1 FLOAT,@y2 FLOAT, @x1 FLOAT, @x2 FLOAT)
RETURNS FLOAT
AS
BEGIN
RETURN (@y2-@y1)/(@x2-@x1)
END
GO

SELECT dbo.steigung(1,2,1,2)
DROP FUNCTION dbo.steigung


-----------------------------------------------------
1.0

(1 row(s) affected)

Der hyperbolische Tangens

Posted on Jul 22, 2004 von in SQL Server

Sozusagen als krönender Abschluss meines Exkurses in die Statistik, hier ein Skript zur Berechnung des hyperbolischen Tangens:

DECLARE @sinhyp FLOAT
DECLARE @coshyp FLOAT
SELECT @sinhyp=0.5, @coshyp=0.5
SELECT
((POWER(EXP(1),@sinhyp) - POWER(EXP(1),-@sinhyp) )/2) /
(( POWER(EXP(1),@coshyp) + POWER(EXP(1),-@coshyp) )/2)

-----------------------------------------------------
0.46211715726000974

(1 row(s) affected)

Auch dies ist eine Adaption aus Excel. Diesmal die Funktion TANHYP(). Da dies nun ziemlich wild aussieht, empfiehlt sich hier der Einsatz der UDF-Variante, die dann komplett so aussieht:

CREATE FUNCTION dbo.hypsin (@sinhyp FLOAT) 
RETURNS FLOAT
AS
BEGIN
RETURN (POWER(EXP(1),@sinhyp) - POWER(EXP(1),-@sinhyp) )/2
END
GO
CREATE FUNCTION dbo.hypcos (@coshyp FLOAT)
RETURNS FLOAT
AS
BEGIN
RETURN ( POWER(EXP(1),@coshyp) + POWER(EXP(1),-@coshyp) )/2
END
GO
CREATE FUNCTION dbo.hyptan (@tanhyp FLOAT)
RETURNS FLOAT
AS
BEGIN
RETURN (dbo.hypsin(@tanhyp)/dbo.hypcos(@tanhyp))
END
GO
SELECT dbo.hyptan(0.5)
DROP FUNCTION dbo.hypsin
DROP FUNCTION dbo.hypcos
DROP FUNCTION dbo.hyptan

-----------------------------------------------------
0.46211715726000974

(1 row(s) affected)

Der hyperbolische Cosinus

Posted on Jul 22, 2004 von in SQL Server

Dies ist die Adaption der Excel Funktion COSHYP()

Ganze Geschichte »