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...