Einzelnen Beitrag anzeigen

Benutzerbild von Leuselator
Leuselator

Registriert seit: 18. Mär 2003
Ort: Berlin
589 Beiträge
 
Delphi 8 Architect
 
#2

Re: MSSQL: Funktion mit mehreren Rückgabewerten "verbau

  Alt 23. Jan 2005, 20:51
Vergiss den Ansatz - mach das SQL-Statement ordentlich und ich schwör Dir, es wird rattenschnell!
Dein Problem sind die vielen Subselects - die machen das ganze Arsch-Lahm.
Eine Funktion, die Dir das gewünschte liefert sieht so aus:
SQL-Code:
 
CREATE FUNCTION stat_Tabelle1 (@Kategorie varchar(10))
RETURNS TABLE
AS
RETURN
      SELECT Kategorie
           , count(*) AS Gesamt
           , sum(erledigt) AS Erledigt
           , CASE WHEN count(*) > 0
                  THEN sum(erledigt)*100/count(*)
                  ELSE NULL
             END AS ProzentErledigt
           , sum(offen) AS Offen
           , CASE WHEN count(*) > 0
                  THEN sum(offen)*100/count(*)
                  ELSE NULL
             END AS ProzentOffen
           , sum(in_Arbeit) AS InArbeit
           , CASE WHEN count(*) > 0
                  THEN sum(in_Arbeit)*100/count(*)
                  ELSE NULL
             END AS ProzentInArbeit
        FROM Tabelle1
    GROUP BY Kategorie
      HAVING RTRIM(Kategorie) = RTRIM(@Kategorie)
Das selbe Ergebnis, mit einem Bruchteil der Operationen Deiner Funktion im Bruchteil der Zeit. Du solltest wirklich nochmal ein Sql-Tutorial durcharbeiten (ist nicht bös gemeint!). Dein Ansatz geht ziemlich prozedural vor und Du wirfst dabei die ganzen Vorteile einer mengenorientierten Sprache wie SQL über Bord - das war ok bei Desktopdatenbanken ist, aber für echte DBMS so, als ob Du einen GPS-Empfänger als Lineal zum malen auf der Landkarte benutzt
Gruß

PS: um nicht in den Verruf zu geraten, keine Antwort auf Deine eigentliche Frage zu geben:
SQL-Code:
Create Procedure UPDATE_Tabelle1_Stats_Was_Keine_Gute_Idee_Ist
AS
begin
  -- lokale Variable, die Du unten benötigst
  DECLARE @Kategorie varchar(10)

  -- alte statistik löschen
  DELETE FROM stat_Tabelle1_Kategorien

  -- neue statistik schreiben (Statistik pro Kategorie mit funktion stat_Tabelle1(Kategorie)

  -- Du brauchst einen Cursor:
    DECLARE csrKategorien
     CURSOR FOR
     SELECT DISTINCT Kategorie
       FROM Tabelle1
  -- den öffnest Du:
  OPEN csrKategorien
  -- und holst Dir die erste Kategorie
  FETCH NEXT
   FROM csrKategorien
   INTO @Kategorie
  -- und wenn es mindestens eine Kategorie gibt, dann:
  WHILE @@FETCH_STATUS = 0 BEGIN
    -- solange Inserten...
    INSERT INTO stat_Tabelle1_Kategorien
         SELECT *
           FROM stat_Tabelle1(@Kategorie)
     -- bis holen der nexten Kategorie fehlschlägt
     FETCH NEXT
      FROM csrKategorien
      INTO @Kategorie
  END
  -- fettich
end
bekomme Zahnschmerzen bei dieser Prozedur, da Du im zweifel immer 5 Minuten alte Werte bekommst (meist genau 5 Minuten zu alt) und Du den armen SQL-Server vergewaltigst...
Tim Leuschner
Programmierer = moderner Sysiphos: stets wenn er meint, den Stein seiner Dummheit auf den Berg des Wissens gewuchtet zu haben, erblickt er einen völlig neuen Aspekt und der Dummfels poltert mit Getöse zurück ins Tal der Unwissenheit...
  Mit Zitat antworten Zitat