Announcement

Collapse
No announcement yet.

Tabelle transformiert joinen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Tabelle transformiert joinen

    Hi

    Hab folgendes Problem, bei dem ich absolut nicht weiter komme.

    Ich hab zwei Tabellen:
    1. Tabelle: AB_ANLAG
    NR | BEZEICHNUNG
    ----+---------------------
    1 | Anlage 1
    2 | Anlage 2


    2. Tabelle: AB_ANLAG_PROBE
    NR | ABNR | DATUM | PROBE
    ----+-------+-------------+-------------
    1 | 1 |01.02.2011 | 300
    2 | 1 |06.03.2011 | 200
    3 | 1 |06.03.2012 | 250
    4 | 2 |05.03.2012 | 20
    5 | 2 |04.08.2012 | 260

    Ich bräuchte aber ein Ergebnis wie folgt:
    Die Tabelle AB_ANLAG_PROBE soll gruppiert nach Datumsjahr aufsummiert werden und an die Tabelle AB_ANLAG angehängt werden. Dabei sollen die Proben aufsummiert mit dem Jahr als Spaltenüberschrift angehängt werden. So dass ich folgendes Ergebnis bekomme:

    NR | BEZEICHNUNG | 2011 | 2012
    ----+----------------------------------
    1 | Anlage 1 | 500 | 250
    2 | Anlage 2 | 0 | 280

    Ich dachte an folgendes Statement:
    [highlight=sql]
    select
    (SELECT sum(PROBE2011.PROBE) as PROBESUM2011 from AB_ANLAG_PROBE PROBE2011 where PROBE2011.DATUM between '01.01.2011' and '31.12.2011') as 2011,
    (SELECT sum(PROBE2012.PROBE) as PROBESUM2012 from AB_ANLAG_PROBE PROBE2012 where PROBE2012.DATUM between '01.01.2012' and '31.12.2012') as 2012,
    AB_ANLAG.*
    from AB_ANLAG
    [/highlight]

    Das funktioniert leider nicht. Ich bekomme folgende Fehlermeldung:

    (Key violation. [Oracle][ODBC][Ora]ORA-00923: FROM keyword not found where expected)

    Ich hab hier ein Oracle 10g zur Verfügung.

    Weiß jemand weiter? Ich find den Fehler nicht. Vielleicht hat auch jemand einen neuen Ansatz?

  • #2
    In der SELECT-Klausel einer SELECT-Anweisung kann entweder das *-Symbol oder eine Spaltenauflistung verwendet werden. Beides gleichzeitig ist nicht erlaubt.


    kuemmelchen

    Comment


    • #3
      Hallo,

      [highlight=sql]
      WITH a AS
      (SELECT '1' bpnr, '12.12.2011' Datum, '10' Betrag FROM dual UNION ALL
      SELECT '2', '18.12.2011', '20' FROM dual UNION ALL
      SELECT '1', '12.12.2011', '20' FROM dual UNION ALL
      SELECT '2', '13.12.2010', '10' FROM dual UNION ALL
      SELECT '1', '14.12.2010', '30' FROM dual UNION ALL
      SELECT '1', '15.12.2010', '10' FROM dual UNION ALL
      SELECT '2', '16.12.2010', '20' FROM dual UNION ALL
      SELECT '1', '17.12.2010', '10' FROM dual UNION ALL
      SELECT '2', '18.12.2011', '10' FROM dual),
      b AS
      (SELECT 'Anlage_1' Anlage ,'1' bpnr FROM dual UNION ALL
      SELECT 'Anlage_2' ,'2' FROM dual)
      select distinct b.anlage,b.bpnr,d.elf,e.zehn
      from a join b on a.bpnr=b.bpnr
      join (select sum(betrag) elf,bpnr from a where extract(year from to_date(a.datum))='2011' GROUP BY bpnr) d
      on a.bpnr=d.bpnr
      join (select sum(betrag) zehn,bpnr from a where extract(year from to_date(a.datum))='2010' GROUP BY bpnr) e
      on a.bpnr=e.bpnr;
      [/highlight]

      Gruß

      Martin

      Comment


      • #4
        Originally posted by Martin R. View Post
        Hallo,

        [highlight=sql]
        WITH a AS
        (SELECT '1' bpnr, '12.12.2011' Datum, '10' Betrag FROM dual UNION ALL
        SELECT '2', '18.12.2011', '20' FROM dual UNION ALL
        SELECT '1', '12.12.2011', '20' FROM dual UNION ALL
        SELECT '2', '13.12.2010', '10' FROM dual UNION ALL
        SELECT '1', '14.12.2010', '30' FROM dual UNION ALL
        SELECT '1', '15.12.2010', '10' FROM dual UNION ALL
        SELECT '2', '16.12.2010', '20' FROM dual UNION ALL
        SELECT '1', '17.12.2010', '10' FROM dual UNION ALL
        SELECT '2', '18.12.2011', '10' FROM dual),
        b AS
        (SELECT 'Anlage_1' Anlage ,'1' bpnr FROM dual UNION ALL
        SELECT 'Anlage_2' ,'2' FROM dual)
        select distinct b.anlage,b.bpnr,d.elf,e.zehn
        from a join b on a.bpnr=b.bpnr
        join (select sum(betrag) elf,bpnr from a where extract(year from to_date(a.datum))='2011' GROUP BY bpnr) d
        on a.bpnr=d.bpnr
        join (select sum(betrag) zehn,bpnr from a where extract(year from to_date(a.datum))='2010' GROUP BY bpnr) e
        on a.bpnr=e.bpnr;
        [/highlight]

        Gruß

        Martin
        Das würde ja nur für genau DIESE Datensätze funktionieren. Die Subselects bau ich aber in C++ zusammen. Demnach ist das variabel.
        Hab die Lösung gefunden. Ist fast das, was ich schon hatte. Den Where-Clause der der Subselects musste erweitert werden und dann gab es noch den Fehler, dass Oracle keine Aliases verwenden kann, die nur aus Zahlen bestehen. Lösung also wie folgt:

        [highlight=sql]
        select
        (SELECT sum(PROBE2011.PROBE) as PROBESUM2011 from AB_ANLAG_PROBE PROBE2011 where PROBE2011.ABNR = AB_ANLAG.IDNR and PROBE2011.DATUM between '01.01.2011' and '31.12.2011') as PROBEN2011,
        (SELECT sum(PROBE2012.PROBE) as PROBESUM2012 from AB_ANLAG_PROBE PROBE2012 where PROBE2012.ABNR = AB_ANLAG.IDNR and PROBE2012.DATUM between '01.01.2012' and '31.12.2012') as PROBEN2012,
        AB_ANLAG.*
        from AB_ANLAG
        [/highlight]

        Comment


        • #5
          Ne, das funktioniert für alle Ds in den betreffenden Jahren.

          [highlight=sql]
          WITH a AS
          (SELECT '1' bpnr, '12.12.2011' Datum, '10' Betrag FROM dual UNION ALL
          SELECT '2', '18.12.2011', '20' FROM dual UNION ALL--
          SELECT '1', '12.12.2011', '20' FROM dual UNION ALL
          SELECT '2', '13.12.2010', '10' FROM dual UNION ALL
          SELECT '1', '14.12.2010', '30' FROM dual UNION ALL
          SELECT '1', '15.12.2010', '10' FROM dual UNION ALL
          SELECT '2', '16.12.2010', '20' FROM dual UNION ALL
          SELECT '1', '17.12.2010', '10' FROM dual UNION ALL
          SELECT '2', '18.12.2011', '10' FROM dual)
          ,b AS (SELECT 'Anlage_1' Anlage ,'1' bpnr FROM dual UNION ALL
          SELECT 'Anlage_2' ,'2' FROM dual)
          SELECT(SELECT sum(PROBE2011.Betrag) AS PROBESUM2011
          FROM a PROBE2011
          WHERE PROBE2011.bpnr = b.bpnr
          AND PROBE2011.DATUM BETWEEN '01.01.2011' AND '31.12.2011') AS PROBEN2011,
          (SELECT sum(PROBE2012.Betrag) AS PROBESUM2012
          FROM a PROBE2012 WHERE PROBE2012.bpnr = b.bpnr
          AND PROBE2012.DATUM BETWEEN '01.01.2010' AND '31.12.2010') AS PROBEN2012,
          b.*
          FROM b;

          [/highlight]


          [highlight=sql]

          WITH a AS
          (SELECT '1' bpnr, '12.12.2011' Datum, '10' Betrag FROM dual UNION ALL
          SELECT '2', '18.12.2011', '20' FROM dual UNION ALL
          SELECT '1', '12.12.2011', '20' FROM dual UNION ALL
          SELECT '2', '13.12.2010', '10' FROM dual UNION ALL
          SELECT '1', '14.12.2010', '30' FROM dual UNION ALL
          SELECT '1', '15.12.2010', '10' FROM dual UNION ALL
          SELECT '2', '16.12.2010', '20' FROM dual UNION ALL
          SELECT '1', '17.12.2010', '10' FROM dual UNION ALL
          SELECT '2', '18.12.2011', '10' FROM dual)
          ,b AS (SELECT 'Anlage_1' Anlage ,'1' bpnr FROM dual UNION ALL
          SELECT 'Anlage_2' ,'2' FROM dual)
          SELECT DISTINCT b.anlage,b.bpnr,d.elf,e.zehn
          FROM a JOIN b ON a.bpnr=b.bpnr
          JOIN (SELECT sum(betrag) elf,bpnr FROM a WHERE extract(year FROM to_date(a.datum))='2011' GROUP BY bpnr) d
          ON a.bpnr=d.bpnr
          JOIN (SELECT sum(betrag) zehn,bpnr FROM a WHERE extract(year FROM to_date(a.datum))='2010' GROUP BY bpnr) e
          ON a.bpnr=e.bpnr;

          [/highlight]

          Comment

          Working...
          X