@omata: allerbest, das klappt schonmal. einziger fehler: die werte werden jedes mal mit dem faktor 6 multipliziert im gegensatz dazu, wenn ich die select-anweisungen wie oben in 3 blöcke aufgeteilt habe. hast du eine idee, woran das liegen kann? Sobald ich die von Dir vorgeschlagene SELECT-Anweisung einzeln laufen lasse, werden die Werte nicht mit 6 multipliziert, also scheinbar hat es etwas mit dem Einlesen durch meinen Cursor zu tun...
SQL-Code:
DELIMITER $$
DROP PROCEDURE IF EXISTS `wert_cur` $$
CREATE PROCEDURE `wert_cur`(in_domain
VARCHAR(45), in_startdate DATE, in_enddate DATE)
MODIFIES
SQL DATA
BEGIN
DECLARE used_pilots VARCHAR(45);
DECLARE used_duration VARCHAR(45);
DECLARE temp_datum DATE;
DECLARE temp_wert FLOAT(7,2);
DECLARE done INT
DEFAULT 0;
/*CASE for used_duration; calculate values*/
DECLARE cur1
CURSOR FOR
SELECT datum,
SUM(
CASE WHEN typ_id = 1
THEN wert
ELSE 0
END)
+
SUM(
CASE WHEN typ_id = 2
THEN wert
ELSE 0
END)
-
SUM(
CASE WHEN typ_id = 3
THEN wert
ELSE 0
END)
-
SUM(
CASE WHEN typ_id = 4
THEN wert
ELSE 0
END)
+
SUM(
CASE WHEN typ_id = 5
THEN wert
ELSE 0
END)
-
CASE WHEN used_duration
IN (15, 20)
THEN SUM(
CASE WHEN typ_id = 6
THEN wert
ELSE 0
END)
ELSE 0
END
-
CASE WHEN used_duration = 20
THEN SUM(
CASE WHEN typ_id = 7
THEN wert
ELSE 0
END)
ELSE 0
END AS wert
FROM element e, config c
WHERE datum
BETWEEN in_startdate
AND in_enddate
AND e.pilot_id
IN (used_pilots)
GROUP
BY datum;
/*create continue handler*/
DECLARE CONTINUE HANDLER
FOR NOT FOUND
SET done=1;
/*create temporary table*/
DROP TEMPORARY TABLE IF EXISTS temp_table_wert;
CREATE TEMPORARY TABLE temp_table_wert (datum DATE, offeredcalls
FLOAT(7,2));
/*read config, select pilots*/
SELECT duration, pilots
INTO used_duration, used_pilots
FROM config c
WHERE c.domain=in_domain;
/*fetch values into temporary table*/
OPEN cur1;
temp_loop:LOOP
FETCH cur1
INTO temp_datum, temp_wert;
IF done=1
THEN
LEAVE temp_loop;
END IF;
IF done=0
THEN
INSERT INTO temp_table_wert (datum, offeredcalls)
VALUES (temp_datum, temp_wert);
END IF;
END LOOP temp_loop;
CLOSE cur1;
SELECT *
FROM temp_table_wert;
END $$
DELIMITER ;