Hallo,
ich möchte noch kurz meinen Lösungsweg skizzieren, den ich jetzt für die ganzen Unterberechnungen angestellt habe:
Der Wert wird mit der Untermethode wie folgt berechnet. Hierbei wird ein temporary table erzeugt, der aus einem Datum+einem Wert besteht.
SQL-Code:
DELIMITER $$
DROP PROCEDURE IF EXISTS `slacd_cur` $$
CREATE PROCEDURE `slacd_cur`(in_domain
VARCHAR(45), in_startdate DATE, in_enddate DATE)
MODIFIES
SQL DATA
BEGIN
/*Call procedure to create temporary table with all pilots used in the specific domain*/
/*get_used_pilots creates temporary table temp_table_used_pilots*/
CALL get_used_pilots(in_domain);
DROP TEMPORARY TABLE IF EXISTS temp_table_slacd;
CREATE TEMPORARY TABLE temp_table_slacd
AS SELECT datum,
(
SUM(
CASE WHEN typ_id = 1
THEN wert
ELSE 0
END)
/
SUM(
CASE WHEN typ_id = 2
THEN wert
ELSE 0
END))*100
AS slacd
FROM element e, temp_table_used_pilots t
WHERE e.datum
BETWEEN in_startdate
AND in_enddate
AND e.pilot_id = t.pilot
GROUP BY datum;
END $$
DELIMITER ;
Die Hauptmethode ruft danach mehrere dieser Unterprozeduren auf, füllt ein temporary table damit und gibt diesen table zurück:
SQL-Code:
DELIMITER $$
DROP PROCEDURE IF EXISTS `test_main_os` $$
CREATE DEFINER=`pentaho`@`%`
PROCEDURE `test_main_os`(in_domain
VARCHAR(45), in_agg
VARCHAR(45),in_startdate DATE, in_enddate DATE)
MODIFIES
SQL DATA
BEGIN
/*Create temporary table to store all values from underlying stored procedures*/
/*Call stored procedure*/
CALL slacd_cur (in_domain, in_agg, in_startdate, in_enddate);
DROP TEMPORARY TABLE IF EXISTS temp_table_test_full;
CREATE TEMPORARY TABLE temp_table_test_full
AS SELECT a.datum, a.slacd, b.slcd
FROM temp_table_slacd a
JOIN temp_table_slacd b
ON a.datum=b.datum;
/*Returning the full temporary table*/
SELECT *
FROM temp_table_test_full;
END $$
DELIMITER ;
Ergebnis:
|datum | slacd1 | slcad2 |
|01.01.2010 | 11 | 23 |
|02.01.2010 | 12 | 27 |
Die Lösung ist DEUTLICH performanter als die zuerst genutzt Variante mit Cursorn und zudem durch einfacheren, reduzierteren Code zu erreichen
Besten Dank für die Hilfe!