Announcement

Collapse
No announcement yet.

vorheriger/nächster Satz

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

  • #16
    Ok. Ich denk jetzt hab ich's verstanden

    Kennt MSSQL analytische Funktionen? In Oracle würde ich dazu LAG bzw. LEAD verwenden.

    Dim
    Zitat Tom Kyte:
    I have a simple philosophy when it comes to the Oracle Database: you can treat it as a black box and just stick data into it, or you can understand how it works and exploit it as a powerful computing environment.

    Comment


    • #17
      LAG und LEAD, also analytische Funktionen, gibt es schon, aber nicht im MSSQL Datenbankmodul direkt, sondern nur im (separaten) Analysis Service vom MSSQL.
      Nur jetzt für den Fall extra ein Cube zu bauen, wäre etwas zuviel an Aufwand.

      Das <> OR Gedöns kann auch mit in die JOIN Bedingung, das sind die alle schön beisammen; nur besser wird es dadurch auch nicht

      [highlight=SQL]SELECT TOP 1 SUB.*
      FROM Artikel as MAIN
      INNER JOIN
      Artikel AS SUB
      ON MAIN.kart_artikel >= SUB.kart_artikel
      AND MAIN.kart_kunde >= SUB.kart_kunde
      AND MAIN.kart_datum >= SUB.kart_datum
      AND (MAIN.kart_artikel <> SUB.kart_artikel
      OR MAIN.kart_kunde <> SUB.kart_kunde
      OR MAIN.kart_datum <> SUB.kart_datum)
      WHERE MAIN.kart_artikel = '00.010.96'
      AND MAIN.kart_kunde = '202'
      AND MAIN.kart_datum = '20081019'
      ORDER BY SUB.kart_artikel DESC, SUB.kart_kunde DESC, SUB.kart_datum DESC[/highlight]
      Olaf Helper

      <Blog> <Xing>
      * cogito ergo sum * errare humanum est * quote erat demonstrandum *
      Wenn ich denke, ist das ein Fehler und das beweise ich täglich

      Comment


      • #18
        Sorry aber war übers we nicht da.

        Leider geht diese Abfrage nicht, also ich bekomme nicht den richtigen Satz.
        z.B bei dieser Abfrage(kart_artikel anderst) bekomme ich den 1 Satz.

        Code:
              SELECT TOP 1 SUB.*
              FROM f_kart AS MAIN
                   INNER JOIN
                   f_kart AS SUB
                       ON MAIN.kart_artikel >= SUB.kart_artikel
                          AND MAIN.kart_kunde >= SUB.kart_kunde
                          AND MAIN.kart_datum >= SUB.kart_datum
                          AND (MAIN.kart_artikel <> SUB.kart_artikel
                               OR MAIN.kart_kunde <> SUB.kart_kunde
                               OR MAIN.kart_datum <> SUB.kart_datum)
              WHERE MAIN.kart_artikel = '00.010.96'
                    AND MAIN.kart_kunde = '202'
                    AND MAIN.kart_datum = '20081017'
              ORDER BY SUB.kart_artikel DESC, SUB.kart_kunde DESC, SUB.kart_datum DESC
        und leider komme ich an den nächsten Satz auch nicht(also <= nehmen) !!
        Habe es auch mit der 1 Lösung Probiert, ist aber der selbe Fehler.

        Kann sich bitte noch mal jemand damit befassen??
        Zuletzt editiert von MScalli; 13.10.2008, 08:31.

        Comment


        • #19
          Stimmt, da war doch tatsächlich noch ein Gedankenfehler drin.

          So geht es aber wirklich:
          [highlight=SQL]USE [tempdb]
          GO

          CREATE TABLE #f_kart
          (kart_artikel varchar(20),
          kart_kunde int,
          kart_datum int);
          GO

          INSERT INTO #f_kart VALUES ('00.010.85', 102, 20081009);
          INSERT INTO #f_kart VALUES ('00.010.85', 102, 20081026);
          INSERT INTO #f_kart VALUES ('00.010.85', 667, 20081031);
          INSERT INTO #f_kart VALUES ('00.010.96', 202, 20081017);
          INSERT INTO #f_kart VALUES ('00.010.96', 202, 20081018);
          INSERT INTO #f_kart VALUES ('00.010.96', 202, 20081019);
          INSERT INTO #f_kart VALUES ('00.010.96', 202, 20081020);
          INSERT INTO #f_kart VALUES ('lol', 666, 0);
          INSERT INTO #f_kart VALUES ('lol', 666, 20080101);
          INSERT INTO #f_kart VALUES ('lol', 666, 20080503);
          INSERT INTO #f_kart VALUES ('lol', 666, 20081231);
          INSERT INTO #f_kart VALUES ('lol2', 666, 20081231);
          GO


          SELECT TOP 1 SUB.*
          FROM #f_kart AS MAIN
          INNER JOIN
          #f_kart AS SUB
          ON (MAIN.kart_artikel = SUB.kart_artikel
          AND MAIN.kart_kunde = SUB.kart_kunde
          AND MAIN.kart_datum > SUB.kart_datum)
          OR
          (MAIN.kart_artikel = SUB.kart_artikel
          AND MAIN.kart_kunde > SUB.kart_kunde)
          OR
          (MAIN.kart_artikel > SUB.kart_artikel)
          WHERE MAIN.kart_artikel = '00.010.96'
          AND MAIN.kart_kunde = '202'
          AND MAIN.kart_datum = '20081017'
          ORDER BY SUB.kart_artikel DESC, SUB.kart_kunde DESC, SUB.kart_datum DESC
          GO

          DROP TABLE #f_kart;
          GO[/highlight]

          [highlight=code]kart_artikel kart_kunde kart_datum
          -------------------- ----------- -----------
          00.010.85 667 20081031

          (1 row(s) affected)
          [/highlight]
          Olaf Helper

          <Blog> <Xing>
          * cogito ergo sum * errare humanum est * quote erat demonstrandum *
          Wenn ich denke, ist das ein Fehler und das beweise ich täglich

          Comment


          • #20
            Also für den nächst kleineren Satz funktioniert es so.

            Ich will echt nicht so rüberkommen als ob ich gar nichts alleine machen will, aber mir ist das echt zu hoch gerade eben.
            Kannst du mir noch sagen wie ich den nächst höheren Satz bekommen.


            Und/oder eine kleine Erklärung wär super.


            Auf jeden fall schon mal danke an alle,
            besonderst an O.Helper weil du dir soviel Arbeit gemacht hast wegen mir.

            Comment


            • #21
              Den nächst-höheren bekommst Du, wenn Du aus den 3x > je ein < machst und die 3x DESC bei der Sortierung entfernst.

              =>
              [highlight=SQL]SELECT TOP 1 SUB.*
              FROM #f_kart AS MAIN
              INNER JOIN
              #f_kart AS SUB
              ON (MAIN.kart_artikel = SUB.kart_artikel
              AND MAIN.kart_kunde = SUB.kart_kunde
              AND MAIN.kart_datum < SUB.kart_datum)
              OR
              (MAIN.kart_artikel = SUB.kart_artikel
              AND MAIN.kart_kunde < SUB.kart_kunde)
              OR
              (MAIN.kart_artikel < SUB.kart_artikel)
              WHERE MAIN.kart_artikel = '00.010.96'
              AND MAIN.kart_kunde = '202'
              AND MAIN.kart_datum = '20081017'
              ORDER BY SUB.kart_artikel, SUB.kart_kunde, SUB.kart_datum[/highlight]

              "Wie erzähle ich es meinem Kinde"; will heissen, wie erklären?

              Es ist ein Self-Join, wobei beim Join mit > gearbeitet wird, was dann ein Kreuzprodukt mit dem Ausgangsdatensatz mit allen anderen Datensätze, die vom PK her eben größer sind.
              Die Berücksichtigung der "Priorität" der PK-Felder werden durch die 3 OR verknüpften JOIN Bedingungen erreicht, also
              "wenn die ersten 2 Felder gleich sind, muss das 3 Feld ungleich (größer/kleiner) sein".
              "Ist bereits das 2te Feld ungleich, ist das 3te Feld egal"
              "Sonst muss zumindest das 1te Feld ungleich sein".
              =>
              (MAIN.kart_artikel = SUB.kart_artikel AND MAIN.kart_kunde = SUB.kart_kunde AND MAIN.kart_datum > SUB.kart_datum)
              OR (MAIN.kart_artikel = SUB.kart_artikel AND MAIN.kart_kunde > SUB.kart_kunde)
              OR (MAIN.kart_artikel > SUB.kart_artikel)

              Zum Schluß wird noch nach den 3 PK Felder sortiert (DESC beim Vorgänger, ASC bei Nachfolger), ebenfalls nach Prio, und davon nur der erste Datensatz zurückgeliefert.
              Olaf Helper

              <Blog> <Xing>
              * cogito ergo sum * errare humanum est * quote erat demonstrandum *
              Wenn ich denke, ist das ein Fehler und das beweise ich täglich

              Comment


              • #22
                yipiiiieeee
                Ich hatte es jetzt so gemacht und ist gegangen..
                eben mit ASC..(heisst wenn nichts angegeben ist wird ASC hergenommen!!)

                Code:
                SELECT TOP 1 SUB.*
                      FROM f_kart AS MAIN
                           INNER JOIN
                           f_kart AS SUB
                               ON (MAIN.kart_artikel = SUB.kart_artikel
                                   AND MAIN.kart_kunde = SUB.kart_kunde
                                   AND MAIN.kart_datum < SUB.kart_datum)
                                  OR
                                  (MAIN.kart_artikel = SUB.kart_artikel
                                   AND MAIN.kart_kunde < SUB.kart_kunde)
                                  OR
                                  (MAIN.kart_artikel < SUB.kart_artikel)
                      WHERE MAIN.kart_artikel = '00.010.85'
                            AND MAIN.kart_kunde = '667'
                            AND MAIN.kart_datum = '20081031'
                      ORDER BY SUB.kart_artikel ASC, SUB.kart_kunde ASC, SUB.kart_datum ASC
                O mann..
                wäre ohne dich niemals auf ne lösung gekommen.
                In anderen Foren hat nicht mal wer auf diese Frage geantwortet...

                1000 Dank!!

                gruss
                MScalli

                PS: jetzt muss ich nur noch den Button finden der diesen Thread als erledigt markiertv

                Comment


                • #23
                  Jetzt habe ich bemerkt das es doch noch ein kleines Problem gibt..

                  Fragt bitte nicht warum, aber ich muss davor immer mit SELECT COUNT(0) abfragen ob es überhaupt 1 Satz gibt(muss also mindestens 1 sein)..

                  geht das auch?? habe bisschen rumprobiert aber bekomme es nicht wirklich rein.
                  Meiner Meinung nach müsste es ja schon hier irgendwo mit eingebaut werden.

                  Code:
                  SELECT TOP 1 SUB.*
                  Bekomme aber egal wo ich es einbauen will nen Fehler.
                  Kann ich das überhaupt in dieser Abfrage mit einbauen??

                  Comment


                  • #24
                    Ok, ich frage nicht ... aber ich bin ein wenig enttäuscht .
                    Welche Fehlermeldung Du bekommst, hast Du je nicht beigeschrieben, aber ich ahne bereits, welche. Lies sie Dir doch mal durch.

                    COUNT ist eine Aggregat-Funktion und wenn man so eine verwendet, gibt es gewisse Einschränkungen.
                    Um es kurz zu mach, lass das ORDER BY weg, dann geht es.

                    [highlight=SQL]SELECT COUNT(*)
                    FROM #f_kart AS MAIN
                    INNER JOIN
                    #f_kart AS SUB
                    ON (MAIN.kart_artikel = SUB.kart_artikel
                    AND MAIN.kart_kunde = SUB.kart_kunde
                    AND MAIN.kart_datum > SUB.kart_datum)
                    OR
                    (MAIN.kart_artikel = SUB.kart_artikel
                    AND MAIN.kart_kunde > SUB.kart_kunde)
                    OR
                    (MAIN.kart_artikel > SUB.kart_artikel)
                    WHERE MAIN.kart_artikel = '00.010.96'
                    AND MAIN.kart_kunde = '202'
                    AND MAIN.kart_datum = '20081017'[/highlight]
                    Olaf Helper

                    <Blog> <Xing>
                    * cogito ergo sum * errare humanum est * quote erat demonstrandum *
                    Wenn ich denke, ist das ein Fehler und das beweise ich täglich

                    Comment


                    • #25
                      OK.. Das Problem bei diesem Programm ist das ich mit meinem Java Programm mit einem bereits bestehenden Cobol Programm kommunizieren muss.(wird zwar bestimmt alles irgendwann Java sein doch ist einfach zuviel um es von heute auf morgen zu ändern).

                      Deswegen ist es nötig alles bereits im SQL-Befehl zu erledigen..

                      Nochmals vielen dank für deine Hilfe. Wär nie drauf gekommen das es am sortieren liegt..

                      Ich versuche echt immer krampfhaft den Fehler zu finden, aber ich glaube ich suche immer an den falschen stellen.. Ein genaueres untersuchen von COUNT hätte mich evtl. zu einer lösung gebracht.
                      Jetzt weiss ich ja wo ich nächstes mal zuerst nach dem Fehler suche

                      gruss
                      MScalli

                      Comment

                      Working...
                      X