Daten sortieren und in Tabelle speichern

MoStyle

Grünschnabel
Hallo Liebe Mitglieder,
ich hoffe ihr könnt mir bei meinem Problem etwas weiter helfen.
Ich habe eine Tabelle mit zwei nach Größe sortierten Spalten. Auf dieser soll nun eine Schleife laufen, welche die Daten von der ersten Zeile an nach <= sortiert und in einer extra "Tabelle" speichert, welcher dann ausgewertet wird (stats_crosstab).

Tabelle:
z_spalte v_spalte
20 18
22 19
34 20
19 23
12 24

z.B.: alle Daten v_spalte <=18 sollen in der Tabelle gespeichert werden. Dann sollen alle Daten <=19, dann <=20 usw Das ganze soll natürlich automatisch laufen. So, dass ich nur die Ergebnisse der Auswertung zu sehen bekomme.
Ich hoffe, ich konnte es euch mein Problem einiger Maßen plausibel darstellen und könnt mir da weiter helfen!
 
In vielen Datenbanken geht etwa das folgendes SQL

Code:
INSERT INTO newTable
SELECT *
FROM oldTable
ORDER BY sortColumn

zB. MySQL:
Code:
INSERT [LOW_PRIORITY | HIGH_PRIORITY] [IGNORE]
    [INTO] tbl_name [(col_name,...)]
    SELECT ...
    [ ON DUPLICATE KEY UPDATE col_name=expr, ... ]
 
Ich hatte es mir ungefähr so vorgestellt:

declare
v_sp number := 1;
begin

loop
select stats_crosstab into temp_table
(z_spalte,v_spalte,'CHISQ_OBS')
from abc
where v_spalte <= v_sp;
v_sp := v_sp + 1;
end loop;

end;
/

Aber das funktioniert nicht ganz. Vielleicht habt ihr ein paar Vorschläge!
 
Ah - PL/SQL. Gut zu wissen mit was du da herumspielst.

Hm - Mist, mein PL/SQL ist schon reichlich eingerostet - was 2 Jahre so bewirken.

Aber dein Code (bitte hier im Forum in CODE-Tags setzen!) macht irgendwie keinen Sinn.
Dein LOOP hat keine Bedinung. Du erhöst einfach jedesmal den counter um 1 und nimmst dann jedesmal alle Datensätze die KleinerGleich sind. Das gibt doppelte Datensätze oder ein Fehler.

Ich versuchs mal so. Ich zähle von 1 bis zum höchsten Wert und führe auf jedem Wert ein Insert durch.
Sollte der Wert nicht belegt sein, wird der Insert mangels Source nicht ausgeführt.
Code:
declare
    v_sp number := 1;
begin

    WHILE vsp <= SELECT MAX(v_spalte) FROM abc
        SELECT stats_crosstab INTO temp_table 
        (z_spalte,v_spalte,'CHISQ_OBS')
        FROM abc
        WHERE v_spalte = v_sp;
        v_sp := v_sp + 1;
    END WHILE;

end;
/

Schöner währe natürlich über einen sortierten Cursor zu gehen.
 
Im Zusammenhang mit einer while-Schleife funktioniert eine Unterabfrage leider nicht! Die Idee war natürlich nicht schlecht.

declare
v_sp number := 1;
begin

WHILE v_sp = (SELECT MAX(v_spalte) FROM abc) loop
SELECT stats_crosstab INTO temp_table
(z_spalte,v_spalte,'CHISQ_OBS')
FROM abc
WHERE v_spalte = v_sp;
v_sp := v_sp + 1;
END loop;

end;
/
 
Ich habe jetzt was ausprobiert. Aber irgenwie habe ich das Gefühl, dass es nicht das ist was ich brauche.

Code:
SET SERVEROUTPUT ON SIZE 100000;

DECLARE
   max_abc   NUMBER;
   min_abc   NUMBER;
   stat_cr       NUMBER;
BEGIN
   SELECT MAX(v_spalte) INTO max_abc FROM abc;
   SELECT v_spalte INTO min_abc FROM abc WHERE ROWNUM=1;
   --max_abc :=3;
   FOR i IN min_abc .. max_abc
   LOOP
      SELECT stats_crosstab(z_spalte,v_spalte, 'CHISQ_OBS')
        INTO stat_cr
        FROM abc
        WHERE v_spalte <= i;
      DBMS_OUTPUT.put_line(i || '=' || stat_cr);
   END LOOP;
END;

Hoffe ihr könnt euch jetzt ein Bild von meiner Situation machen.
 
item: Um den min_abc zu finden solltes du auch die Funktion MIN() verwenden.

item: warum in der Schleife beim WHERE das "<=" und nicht nur "=" ?
 

Neue Beiträge

Zurück