Announcement

Collapse
No announcement yet.

kleiner als bei nichtgemeinsamer Schnittmenge

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

  • kleiner als bei nichtgemeinsamer Schnittmenge

    Hallo Zusammen,

    wieder einmal eine Bitte um Hilfe.

    Für eine Abfrage möchte ich zwei Tabellen vergleichen, aus einer Tabelle alle Werte, aus der anderen alle Werte welche kleiner/gleich dem Maximalwert der XeXrXsXtXeXnX zweiten Tabelle sind.

    [HIGHLIGHT=SQL]
    SELECT
    monatssummen.Kal_Mon AS Kalendermonat ,
    monatssummen.Sum_Mon AS PLANzahlen,
    sapsumme0822.betrag AS ISTzahlen
    FROM monatssummen
    LEFT JOIN
    sapsumme0822
    ON
    monatssummen.Kal_Mon = sapsumme0822.KalMon
    [/HIGHLIGHT]

    Kalendermonat PLANzahlen ISTzahlen
    2011-10 370
    2011-11 5733.33
    2011-12 8351.18 11571.44
    2012-01 10463.13 10195.96
    2012-02 7949.15 10534.29
    2012-03 4512.78 5601.66
    2012-04 7016.22 2637.5
    2012-05 13974.66 9628.69
    2012-06 31963.04 28686.17
    2012-07 41219.79 43561.24
    2012-08 22227.42 34784.61
    2012-09 29481.06 26563.09
    2012-10 52339.53 36984.6
    2012-11 72221.33 84374.12
    2012-12 71546.76
    2013-01 66682.53
    2013-02 43505.15
    2013-03 16978.45
    2013-04 2516
    Ausgegeben sollen aber in den Spalten Kalendermonat und PLANzahlen nur Daten, welche kleiner oder gleich dem Maximalen Monat der Tabelle sapzahlen0822 sind.

    Kalendermonat PLANzahlen ISTzahlen
    2011-10 370
    2011-11 5733.33
    2011-12 8351.18 11571.44
    2012-01 10463.13 10195.96
    2012-02 7949.15 10534.29
    2012-03 4512.78 5601.66
    2012-04 7016.22 2637.5
    2012-05 13974.66 9628.69
    2012-06 31963.04 28686.17
    2012-07 41219.79 43561.24
    2012-08 22227.42 34784.61
    2012-09 29481.06 26563.09
    2012-10 52339.53 36984.6
    2012-11 72221.33 84374.12
    Ich habe schon alle möglichen mir einfallenden Kombinationen in der WHERE klausel ausprobiert. Entweder werden alle Monate der einen Tabelle mit allen Monaten der andren Tabelle verglichen, oder aber es werden lediglich die Monate "2011-11" bis "2012-11" ausgegeben.
    Umrechnung der Monate auf Julianday hat mir auch nichts gebracht.

    Kann mir hier jemand weiterhelfen?

    Vielen Dank
    Wolf-Tilmann
    Zuletzt editiert von Wolf-Tilmann; 18.12.2012, 12:53. Reason: Fehler erste statt zweite Tabelle
    Aktuell "unerlaubt" verwendete Datenbank: SQLite - Da kommt mein Admin nicht dahinter :-)

    Ach ja:
    Daten lassen sich am Besten mit der Keule bearbeiten.

  • #2
    Hallo,

    wie definierst du bzw. was verstehst du unter "Maximalwert der ersten Tabelle"?

    Gruß Falk
    Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

    Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

    Comment


    • #3
      Die grundlegende Frage von Falk ist zunächst zu klären. Anschließend kannst du die ON-Klausel entsprechend anpassen. Dort kann nicht nur auf eine Gleichheit (meistens über einen ForeignKey) geprüft werden, sondern es ist (fast) jede Bedingung zulässig, die auch in der WHERE-Klausel möglich ist, also auch AND/OR und etwas wie " <= Max()". Jürgen

      Comment


      • #4
        Der ALL Operator dürfte auch deinen Wünschen entsprechen

        http://www.oracle-base.com/articles/...in-sql.php#all

        Comment


        • #5
          Zuerst einmal, Ihr habe mich bei einem flüchtigkeitsfehler erwischt.
          Es muss "zweite Tabelle" heißen.
          Als Maximalwert meine ich den im Laufe alle Eintragungen höchsten Monat in der Tabelle "sapzahlen0822".

          Hintergrund

          In der Tabelle monatssummen, welche eigentlich ein View ist, habe ich lediglich zwei Spalten
          1. Kal_Mon: hier werden mittels GROUP BY die Kalendermonate aller meiner Planungen zusammengefasst
          2. Sum_Mon: hier werden die TOTAL-werte je Kalendermonat summiert

          Die Tabelle sapsumme0822 enthält auch lediglich zwei Spalten
          1. KalMon: hier werden mittels GROUP BY die Kalendermonate aller IST-Zahlungen zusammengefasst
          2. betrag: hier werden die TOTAL-werte je Kalendermonat summiert

          In der Abfrage um welche es mir hier geht, möchte ich die PLAN- den IST-Zahlen gegenüberstellen.
          Da aber die IST-Zahlen gelegentlich erst Monate später ermittelt weden können und damit in der Tabelle sapsumme0822 stehen, benötige alle PLAN-Zahlen aus der Zeit vor/einschließlich der aktuellsten Zahlen aus sapsumme0822.
          Das ist vielleicht etwas unverständlich, deshalb habe ich oben die zwei Tabellen eingegeben.

          Wolf-Tilmann
          Aktuell "unerlaubt" verwendete Datenbank: SQLite - Da kommt mein Admin nicht dahinter :-)

          Ach ja:
          Daten lassen sich am Besten mit der Keule bearbeiten.

          Comment


          • #6
            Hallo,
            ich verstehe leider noch nicht ganz die Bedingung.

            Also in der Tabelle/View "monatssummen" gibt es zwei Spalten. Einmal der Kalendermonat und dazu die geplanten Zahlen.

            In der Tabelle "sapsumme0822" gibt es ebenfalls die Spalte Kalendermonat und dazu (falls vorhanden) die IST-Summe, also wie viel Geld oder Ähnliches wirklich verwendet wurde.

            Was genau möchtest du nun ermitteln?

            Vielleicht stehe ich auch nur auf dem Schlauch und jemand anderes hat es schon verstanden :P

            MfG


            Edit:

            Hier ein paar Testdaten:

            [highlight=sql]
            create table monatssummen
            (
            Kal_Mon VARCHAR2(7),
            Sum_Mon NUMBER
            );

            create table sapsumme0822
            (
            Kal_Mon VARCHAR2(7),
            betrag NUMBER
            );

            insert into monatssummen values ('2011-10', 370);
            insert into monatssummen values ('2011-11', 5733.33);
            insert into monatssummen values ('2011-12', 8351.18);
            insert into monatssummen values ('2012-01', 10463.13);
            insert into monatssummen values ('2012-02', 7949.15);
            insert into monatssummen values ('2012-03', 4512.78);
            insert into monatssummen values ('2012-04', 7016.22);

            insert into sapsumme0822 values ('2011-10', NULL);
            insert into sapsumme0822 values ('2011-11', NULL);
            insert into sapsumme0822 values ('2011-12', 11571.44);
            insert into sapsumme0822 values ('2012-01', 10195.96);
            insert into sapsumme0822 values ('2012-02', 10534.29);
            insert into sapsumme0822 values ('2012-03', 5601.66);
            insert into sapsumme0822 values ('2012-04', 2637.5);
            [/highlight]
            Zuletzt editiert von FlexGer; 18.12.2012, 15:40.

            Comment


            • #7
              Originally posted by FlexGer View Post
              ...ich verstehe leider noch nicht ganz die Bedingung.
              Du bist nicht alleine, ich verstehs auch nicht ...
              Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

              Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

              Comment


              • #8
                Hallo,

                PLANzahlen werden für einen Monat geplant, können aber u.U. in den folgenden Monaten erst als ISTzahlen erscheinen.
                Damit können ISTzahlen nur für die vorangegangen PLANmonate oder dem aktuellen PLANmonat stehen.

                Dadurch kann ich immer vergleichen, wann tatsächlich die geplanten Ausgaben angefallen sind.

                Nehmen wir einmal als Beispiel die Monate '2011-10', '2011-11' und '2011-12'
                Für die Monate 10 und 11 sind Ausgaben geplant gewesen.
                Wegen verschiedener Gründe wurden aber die Ausgaben erst in 12 abgearbeitet.

                Geplant '2011-10' bis '2011-12' waren 14.545,51 Euro
                Tatsächlich wurden lediglich 11.571,44 ausgegeben.

                Zum letzten Monat der ISTzahlen addiere ich alle ISTzahlen seit Anbeginn zusammen,
                Dem gegenüber stelle ich die PLANzahlen seit Anbeginn bis einschließlich des letzten Monats der ISTzahlen.
                (UNION)

                Dadurch sehe ich wie sich die ISTzahlen zu den PLANzahlen entwickeln sowie es zum aktuellen Sachstand der ermittelten ISTzahlen über das gesamte Projekt hinaus verhält.

                Was das ganze total verfälscht sind die PLANzahlen in die Zukunft aus Sicht der letzten ISTzahlen. In meinem Beispiel die Monate '2012-12' bis einschließlich '2013-04'. Diese dürfen nicht erscheinen, da diesen keine ISTzahlen gegenübergestellt weden können.

                Ich weiß, etwas verquert, aber es ist leider so.

                Wolf-Tilmann
                Aktuell "unerlaubt" verwendete Datenbank: SQLite - Da kommt mein Admin nicht dahinter :-)

                Ach ja:
                Daten lassen sich am Besten mit der Keule bearbeiten.

                Comment


                • #9
                  So?

                  [highlight=sql]
                  SELECT monat.Kal_Mon AS Kalendermonat ,
                  monat.Sum_Mon AS PLANzahlen,
                  sap.betrag AS ISTzahlen
                  FROM monatssummen monat
                  LEFT JOIN
                  sapsumme0822 sap
                  ON
                  (monat.Kal_Mon = sap.Kal_Mon)
                  WHERE sap.betrag IS NOT NULL;
                  [/highlight]

                  Comment


                  • #10
                    Originally posted by Wolf-Tilmann View Post
                    ...Was das ganze total verfälscht sind die PLANzahlen in die Zukunft aus Sicht der letzten ISTzahlen. In meinem Beispiel die Monate '2012-12' bis einschließlich '2013-04'. Diese dürfen nicht erscheinen, da diesen keine ISTzahlen gegenübergestellt weden können.
                    Warum verwendest du dann nicht einfach einen INNER JOIN statt einem LEFT JOIN? Damit würdest du nur die Planzahlen bekommen, zu denen es auch ein IST gibt.

                    Gruß Falk
                    Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

                    Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

                    Comment


                    • #11
                      Habe ich mich auch gefragt, aber vielleicht ist dies auch nicht das gewünschte Ergebnis.
                      Ist jedenfalls kompliziert beschrieben^^

                      [highlight=sql]
                      SELECT monat.Kal_Mon AS Kalendermonat ,
                      monat.Sum_Mon AS PLANzahlen,
                      sap.betrag AS ISTzahlen
                      FROM monatssummen monat
                      JOIN
                      sapsumme0822 sap
                      ON
                      (monat.Kal_Mon = sap.Kal_Mon)
                      WHERE sap.betrag IS NOT NULL;
                      [/highlight]

                      Comment


                      • #12
                        Originally posted by Falk Prüfer View Post
                        Warum verwendest du dann nicht einfach einen INNER JOIN statt einem LEFT JOIN? Damit würdest du nur die Planzahlen bekommen, zu denen es auch ein IST gibt.
                        Und damit würden auch die Monate '2011-10' und 2011-11' unter den Tisch fallen, in denen PLANzahlen festgelegt wurden.

                        Gruß
                        Wolf-Tilmann
                        Aktuell "unerlaubt" verwendete Datenbank: SQLite - Da kommt mein Admin nicht dahinter :-)

                        Ach ja:
                        Daten lassen sich am Besten mit der Keule bearbeiten.

                        Comment


                        • #13
                          Originally posted by FlexGer View Post
                          Habe ich mich auch gefragt, aber vielleicht ist dies auch nicht das gewünschte Ergebnis.
                          Ist jedenfalls kompliziert beschrieben^^

                          [highlight=sql]
                          SELECT monat.Kal_Mon AS Kalendermonat ,
                          monat.Sum_Mon AS PLANzahlen,
                          sap.betrag AS ISTzahlen
                          FROM monatssummen monat
                          JOIN
                          sapsumme0822 sap
                          ON
                          (monat.Kal_Mon = sap.Kal_Mon)
                          WHERE sap.betrag IS NOT NULL;
                          [/highlight]
                          Das ergibt leider
                          2011-12 8351.18 11571.44
                          2012-01 10463.13 10195.96
                          2012-02 7949.15 10534.29
                          2012-03 4512.78 5601.66
                          2012-04 7016.22 2637.5
                          2012-05 13974.66 9628.69
                          2012-06 31963.04 28686.17
                          2012-07 41219.79 43561.24
                          2012-08 22227.42 34784.61
                          2012-09 29481.06 26563.09
                          2012-10 52339.54 36984.6
                          2012-11 72221.35 84374.12
                          Es fehlen also die Monate '2011-10' und '2011-11'

                          Kompliziert stimmt. An dem haben schon einige verzweifelt.
                          Ich probiere es einmal so
                          Code:
                          SELECT 
                          ISTmonate,
                          ISTmonatsbetrag,
                          PLANmonate, 
                          PLANmonatsbetrag
                          VON PLAN , IST
                          WENN
                          ISTmonat <= PLANmonat
                          #####
                          PLANmonate in Zukunft vom letzen ISTmonat --> vergiss es
                          Von Hand bekomme ich das schon mit einer Tabellenkalkulation hin, aber ich brauche es als Datenbank

                          Hmmmmm, vielleicht verdeutlicht das etwas (INFO: sapsumme0922 enthält keine Monate '2011-10' und '2011-11'
                          [HIGHLIGHT=SQL]
                          CREATE TABLE monatssummen
                          (
                          Kal_Mon TEXT,
                          Sum_Mon REAL
                          );

                          CREATE TABLE sapsumme0822
                          (
                          Kal_Mon TEXT,
                          betrag REAL
                          );


                          INSERT INTO "monatssummen" VALUES('2011-10',370);
                          INSERT INTO "monatssummen" VALUES('2011-11',5733.33);
                          INSERT INTO "monatssummen" VALUES('2011-12',8351.18);
                          INSERT INTO "monatssummen" VALUES('2012-01',10463.13);
                          INSERT INTO "monatssummen" VALUES('2012-02',7949.15);
                          INSERT INTO "monatssummen" VALUES('2012-03',4512.78);
                          INSERT INTO "monatssummen" VALUES('2012-04',7016.22);
                          INSERT INTO "monatssummen" VALUES('2012-05',13974.66);
                          INSERT INTO "monatssummen" VALUES('2012-06',31963.04);
                          INSERT INTO "monatssummen" VALUES('2012-07',41219.79);
                          INSERT INTO "monatssummen" VALUES('2012-08',22227.42);
                          INSERT INTO "monatssummen" VALUES('2012-09',29481.06);
                          INSERT INTO "monatssummen" VALUES('2012-10',52339.54);
                          INSERT INTO "monatssummen" VALUES('2012-11',72221.35);
                          INSERT INTO "monatssummen" VALUES('2012-12',71546.77);
                          INSERT INTO "monatssummen" VALUES('2013-01',66992.54);
                          INSERT INTO "monatssummen" VALUES('2013-02',44235.17);
                          INSERT INTO "monatssummen" VALUES('2013-03',17708.45);
                          INSERT INTO "monatssummen" VALUES('2013-04',2516);


                          INSERT INTO "sapsumme0822" VALUES('2011-12',11571.44);
                          INSERT INTO "sapsumme0822" VALUES('2012-01',10195.96);
                          INSERT INTO "sapsumme0822" VALUES('2012-02',10534.29);
                          INSERT INTO "sapsumme0822" VALUES('2012-03',5601.66);
                          INSERT INTO "sapsumme0822" VALUES('2012-04',2637.5);
                          INSERT INTO "sapsumme0822" VALUES('2012-05',9628.69);
                          INSERT INTO "sapsumme0822" VALUES('2012-06',28686.17);
                          INSERT INTO "sapsumme0822" VALUES('2012-07',43561.24);
                          INSERT INTO "sapsumme0822" VALUES('2012-08',34784.61);
                          INSERT INTO "sapsumme0822" VALUES('2012-09',26563.09);
                          INSERT INTO "sapsumme0822" VALUES('2012-10',36984.6);
                          INSERT INTO "sapsumme0822" VALUES('2012-11',84374.12);

                          [/HIGHLIGHT]

                          Tatsächlich handelt es sich bei beiden um Views
                          [HIGHLIGHT=SQL]
                          CREATE VIEW 'monatssummen' AS SELECT Kal_Mon AS KAL_Mon , round(total(gehalt_mon),2) AS Sum_Mon FROM persmonate GROUP BY Kal_Mon UNION SELECT 'Summe' AS Kal_Mon, round(total(gehalt_mon),2) AS Sum_Mon From persmonate

                          CREATE VIEW 'sapsumme0822' AS SELECT (jahr||'-'||monat) AS KalMon, Round(total(betrag),2) AS Betrag FROM sapauszug
                          WHERE pos LIKE '0822 GROUP BY KalMon
                          UNION
                          SELECT 'Summe' AS KalMon, round(total(betrag),2) AS Betrag FROM sapauszug WHERE pos
                          LIKE '0822'
                          [/HIGHLIGHT]

                          Schönen Abend
                          Wolf-Tilmann
                          Zuletzt editiert von Wolf-Tilmann; 18.12.2012, 22:09.
                          Aktuell "unerlaubt" verwendete Datenbank: SQLite - Da kommt mein Admin nicht dahinter :-)

                          Ach ja:
                          Daten lassen sich am Besten mit der Keule bearbeiten.

                          Comment


                          • #14
                            Würde dies hier passen?

                            [highlight=sql]
                            SELECT monat.Kal_Mon AS Kalendermonat ,
                            monat.Sum_Mon AS PLANzahlen,
                            sap.betrag AS ISTzahlen
                            FROM monatssummen monat
                            LEFT OUTER JOIN sapsumme0822 sap ON monat.Kal_Mon = sap.Kal_Mon;
                            [/highlight]

                            Gruss

                            Comment


                            • #15
                              Originally posted by Wernfried View Post
                              Würde dies hier passen?

                              [highlight=sql]
                              SELECT monat.Kal_Mon AS Kalendermonat ,
                              monat.Sum_Mon AS PLANzahlen,
                              sap.betrag AS ISTzahlen
                              FROM monatssummen monat
                              LEFT OUTER JOIN sapsumme0822 sap ON monat.Kal_Mon = sap.Kal_Mon;
                              [/highlight]

                              Gruss

                              da würde ich noch ein
                              [highlight=sql]
                              where monat.Kal_Mon<=date('now')
                              [/highlight]
                              dranhängen.

                              Der Date Typ bzw. der Vergleich muss aber wahrscheinlich noch angeglichen werden.
                              Gruß, defo

                              Comment

                              Working...
                              X