Hallo,
ich blutiger Anfänger in der SQL Scripterei und komme gerade mit dem selbst Anlernen nicht weiter.
Ich stelle eine Datenbankabfrage die nur auf das Zählen auf Grund bestimmter Vorraussetzungen abzielt.
Die Tabelle soll den Grunddatenbestand immer zählen das ist tab1 agebst, in der Tabelle tab2 agebtaet sind alle Untertätigkeiten aufgeführt.
Diese Untertätigkeiten sollen zusätlich gezählt werden, wenn die Bedingung nicht NULL ist. Aus der Abfrage das Grunddatenbestandes und der Untertätigkeit ergibt sich ein Rest, der soll ebenfalls gezählt werden.
Bei diesem Rest beginnen jetzt meine Probleme, der will nicht so wie ich will.
Hier mein script und das Ergebnis:
SELECT DISTINCT rest.aart, anr, Vorgang, Erledigt, rest.vorgang - rest.erledigt as Rest
FROM (
SELECT DISTINCT test.aart, test.anr, COUNT(test.adatum)as Vorgang, COUNT(test.datum2)as Erledigt
FROM (
SELECT DISTINCT tab1.aart, tab1.anr, tab1.adatum, tab2.datum2, tab1.astatus, tab2.datum1, tab2.taet_id, tab2.bearb
FROM agebst tab1 LEFT OUTER JOIN agebtaet tab2
ON tab1.anr = tab2.anr AND
tab1.ajahr = tab2.ajahr AND
tab1.aart = tab2.aart
WHERE (tab1.astatus != 'A')
AND ((tab1.aart = 'V01' OR tab1.aart = 'V07' OR tab1.aart = 'V09')
AND (tab1.adatum >= '2009-02-01'AND tab1.adatum <= '2009-03-31' )
AND (tab2.taet_id = '2020' OR tab2.datum2 IS NULL)
AND (tab1.astatus != 'Z' OR (tab2.datum1 IS NOT NULL AND tab2.datum2 IS NOT NULL)))
)AS test
group by aart, anr) as Rest
group by rest.aart, rest.anr, rest.vorgang, rest.erledigt
Ergebnis
Vorgang lfd. Nr. angelegt erledigt rest
"V01 "; 55; 1; 0; 1
"V01 "; 62; 1; 0; 1
"V01 "; 73; 1; 1; 0
"V07 "; 36; 1; 0; 1
"V07 "; 87; 1; 0; 1
"V09 "; 27; 1; 1; 0
"V09 "; 35; 1; 1; 0
Erklärung
Theoretisch ist, die Tabelle genau das was ich will aber leider ist das Ergebnis nur eine Behelfskrücke, die erste SELECT Anweisung hat irgendwie nen Denkfehler. Ziel ist es die Gesamtheit aller gleichen Vorgänge anzeigen zu lassen, die lfd. Nr. ist uninteressant.
Wenn ich die lfd. Nr. [anr] aus der Selectanweisung entfernen ergibt dies folgendes Ergebnis.
"V01 ";1;0;1
"V01 ";1;1;0
"V07 ";1;0;1
"V09 ";1;1;0
es sollte aber sein
V1 3;1;2
V7 2;0;2
V9 2;2;0
Vielleicht kann mir ja Jemand nen entscheidenen Tip geben.
Anm. Mir wurde von jemanden der sich mit SQL aber leider nicht mir Postgr auskennt gesagt, ich soll für die Countbefehle in dieser Anweisung:
SELECT DISTINCT test.aart, test.anr, COUNT(test.adatum)as Vorgang, COUNT(test.datum2)as Erledigt
Variablen vergeben und direkt die Resterechnung mit einbauen ohne die "Behelfskrücke" nur hab ich bisher keine Anleitung zur Variablennutzung gefunden.
Vielen Dank für eure Hilfe
ich blutiger Anfänger in der SQL Scripterei und komme gerade mit dem selbst Anlernen nicht weiter.
Ich stelle eine Datenbankabfrage die nur auf das Zählen auf Grund bestimmter Vorraussetzungen abzielt.
Die Tabelle soll den Grunddatenbestand immer zählen das ist tab1 agebst, in der Tabelle tab2 agebtaet sind alle Untertätigkeiten aufgeführt.
Diese Untertätigkeiten sollen zusätlich gezählt werden, wenn die Bedingung nicht NULL ist. Aus der Abfrage das Grunddatenbestandes und der Untertätigkeit ergibt sich ein Rest, der soll ebenfalls gezählt werden.
Bei diesem Rest beginnen jetzt meine Probleme, der will nicht so wie ich will.
Hier mein script und das Ergebnis:
SELECT DISTINCT rest.aart, anr, Vorgang, Erledigt, rest.vorgang - rest.erledigt as Rest
FROM (
SELECT DISTINCT test.aart, test.anr, COUNT(test.adatum)as Vorgang, COUNT(test.datum2)as Erledigt
FROM (
SELECT DISTINCT tab1.aart, tab1.anr, tab1.adatum, tab2.datum2, tab1.astatus, tab2.datum1, tab2.taet_id, tab2.bearb
FROM agebst tab1 LEFT OUTER JOIN agebtaet tab2
ON tab1.anr = tab2.anr AND
tab1.ajahr = tab2.ajahr AND
tab1.aart = tab2.aart
WHERE (tab1.astatus != 'A')
AND ((tab1.aart = 'V01' OR tab1.aart = 'V07' OR tab1.aart = 'V09')
AND (tab1.adatum >= '2009-02-01'AND tab1.adatum <= '2009-03-31' )
AND (tab2.taet_id = '2020' OR tab2.datum2 IS NULL)
AND (tab1.astatus != 'Z' OR (tab2.datum1 IS NOT NULL AND tab2.datum2 IS NOT NULL)))
)AS test
group by aart, anr) as Rest
group by rest.aart, rest.anr, rest.vorgang, rest.erledigt
Ergebnis
Vorgang lfd. Nr. angelegt erledigt rest
"V01 "; 55; 1; 0; 1
"V01 "; 62; 1; 0; 1
"V01 "; 73; 1; 1; 0
"V07 "; 36; 1; 0; 1
"V07 "; 87; 1; 0; 1
"V09 "; 27; 1; 1; 0
"V09 "; 35; 1; 1; 0
Erklärung
Theoretisch ist, die Tabelle genau das was ich will aber leider ist das Ergebnis nur eine Behelfskrücke, die erste SELECT Anweisung hat irgendwie nen Denkfehler. Ziel ist es die Gesamtheit aller gleichen Vorgänge anzeigen zu lassen, die lfd. Nr. ist uninteressant.
Wenn ich die lfd. Nr. [anr] aus der Selectanweisung entfernen ergibt dies folgendes Ergebnis.
"V01 ";1;0;1
"V01 ";1;1;0
"V07 ";1;0;1
"V09 ";1;1;0
es sollte aber sein
V1 3;1;2
V7 2;0;2
V9 2;2;0
Vielleicht kann mir ja Jemand nen entscheidenen Tip geben.
Anm. Mir wurde von jemanden der sich mit SQL aber leider nicht mir Postgr auskennt gesagt, ich soll für die Countbefehle in dieser Anweisung:
SELECT DISTINCT test.aart, test.anr, COUNT(test.adatum)as Vorgang, COUNT(test.datum2)as Erledigt
Variablen vergeben und direkt die Resterechnung mit einbauen ohne die "Behelfskrücke" nur hab ich bisher keine Anleitung zur Variablennutzung gefunden.
Vielen Dank für eure Hilfe
Comment