Mittwoch, 29. Februar 2012

ORACLE Analytische Funktionen

Man möchte für jede Abteilung die Löhne der einzelnen Mitarbeitern im Vergleich des gesamt Lohns pro Abteilung ausgeben:

Mit einem herkömmlichen Select kann dies so gelöst werden:

SELECT e1.deptno, e1.sal, e2.sum_sal, (e1.sal/e2.sum_sal) sum_tot
FROM emp e1,
 (
   SELECT deptno, SUM (sal) sum_sal
   FROM emp
   GROUP BY deptno
) e2
WHERE e1.deptno = e2.deptno
ORDER BY e1.deptno

Hier muss die Tabelle EMP zwei Mal ausgelesen werden. Oracle biete Analytische Funktionen, damit die Tabelle EMP nur einmal ausgelesen werden muss. Das Pendant zum obigen Select sieht dann so aus:
SELECT depno, empno, sal, RATIO_TO_REPORT(sal) OVER (PARTITION BY deptno) sum_tot
FROM emp

SQL Summe der Löhne pro Abteilung berechnen

Query:
SELECT ABTEILUNG, SUM(LOHN)
FROM TMP_TVD_EMP
GROUP BY ABTEILUNG



EMPNOSALDEPTNO
736980020
7499160030
7521125030
7566297520
7654125030
7698285030
7782245010
7788300020
7839500010
7844150030
7876110020
790095030
7902300020
7934130010

Dienstag, 28. Februar 2012

ORACLE Substr()

Die Substr-Funktion gibt einen Teil eines bestehenden Strings zurück.
substr( string, start_position, [ länge] )

Für start_position kann 0 oder 1 angegeben werden, dadurch wird der string von Beginn aus ausgelesen

Beispiele:
substr( 'string', 1 )gibt string zurück

substr( 'string', 0 )gibt auch string zurück

substr( 'string', 0, 3 ) gibt str zurück

Montag, 20. Februar 2012

ORACLE UNION ALL

select field1, field2, . field_n
from TABLE_A
UNION ALL
select field1, field2, . field_n
from TABLE_B

Spalten on the Fly hinzufügen:
z.B Tabelle_B hat eine Spalte 'Wayne' welche in A nicht enthalten ist. Nun möchte man über diese Spalte Wayne ein Lookup machen, somit lautet der Select für Spalte_A:
SELECT A.*, NULL AS WAYNE, Schon hat man in der Tabelle_A eine zusätzliche Spalte, ohne die Tabelle A zu verändern.

Freitag, 3. Februar 2012

Subselects

SELECT *
FROM
(
       SELECT A.BUCHUNGSDATUM, B.GUELTIG_VON
       FROM (
                    SELECT * FROM TABELLE TAB_A
             ) A,
             (
                    SELECT * FROM TABELLE TAB_B
             ) B
       WHERE A.KOSTENSTELLE = B.KOSTENSTELLE(+)
)
WHERE ....