Announcement

Collapse
No announcement yet.

höchster Wert nach Gruppierung bestimmen

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

  • höchster Wert nach Gruppierung bestimmen

    Hallo an alle

    ich suche eine Lösung für mein Lieferanten Problem.

    ich habe pro Lieferant mehrere Einträge und ich möchte davon den höchsten Eintrag in punkto wann wurde das letzte mal geliefert haben.

    zb.
    Lieferanten-NR Lieferdatum
    100 23.10.2012
    100 04.03.2013

    usw. (naturlich noch mehr Lieferanten *G*)

    wie bekomme ich das hin! stehe total auf dem Schlauch! Wer kann helfen?

    ich habe es gruppiert aber vorher muss ich ja nicht max lieferdatum bestimmen das müsste doch mit einer subselection gehen aber ich bekomme es einfach nicht hin

  • #2
    Hallo,

    verwende MAX(Lieferdatum) im SELECT-Teil der Query.
    [highlight=sql]
    SELECT Lieferant, MAX(Lieferdatum)
    FROM Tabelle
    GROUP BY Lieferant
    [/highlight]

    mfG Gü
    "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

    Comment


    • #3
      ...oder auch: Bei "doppelten" Datensätzen nur einen anzeigen

      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


      • #4
        Sehr gut falk!! klappt bestens habe es mit einer subselection erstellt. Jedoch habe ich nun ein weiteres Problem ich habe noch zig joints drin und würde nun aber gern den join und das einzelne Statement zusammen führen.

        Code:
        SELECT 
        LIEF_NR
        ,LETZT_LI_DAT
        
        FROM dbo.Datentabelle a 
        WHERE a.LETZT_LI_DAT = (
          SELECT MAX(b.LETZT_LI_DAT)
          FROM  dbo.Datentabelle b 
          WHERE b.LIEF_NR = a.LIEF_NR
        )
        funzt sehr gut! 
        
        Aber: 
        Select 
        --einige Spalten
        dbo.Umsatz.letztes_Jahr,dbo.Datentabelle.LETZT_LI_DAT,dbo.Datentabelle.LIEF_NR
        
        From 
        --einige InnerJoints
        dbo.Umsatz INNER JOIN dbo.Datentabelle ON dbo.Umsatz.letztes_Jahr = dbo.Datentabelle.letztes_Jahr .....
        -- bis hin zu
        
        INNER JOIN dbo.Datentabelle a ON -- mit a hinter der Quelle gebe ich ihn doch ein synonym und mit welchen ich dann die Where Klausel nutzen wollte. 
        
        WHERE a.LETZT_LI_DAT = (
          SELECT MAX(b.LETZT_LI_DAT)
          FROM  dbo.Datentabelle b 
          WHERE b.LIEF_NR = a.LIEF_NR
        )
        Jedoch bekomme ich das nicht hin! mach ich was falsch?! habe ich einen Denkfehler?

        Wäre nett wenn ihr nochmals helfen könntet

        Comment


        • #5
          Hallo,
          Originally posted by deathdragon View Post
          ...Jedoch bekomme ich das nicht hin!
          Das ist keine qualifizierte Fehlerbeschreibung!
          Was geht denn schief, bzw. WAS genau bekommst du nicht hin? Und was heisst das? Gibt es eine Fehlermeldung oder nur nicht das erwartete Ergebnis?
          Ohne das jetzt genau betrachtet zu haben: ich würde bei mehrfacher Verwendung einer Tabelle (dbo.Datentabelle) JEDER davon einen separaten Alias verpassen, um Verwechslungen von vornherein auszuschliessen.

          Originally posted by deathdragon View Post
          ...mach ich was falsch?! habe ich einen Denkfehler?
          Offensichtlich: Ja

          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


          • #6
            Hallo Falk danke erstmal das du dir wieder zeitgenommen hast.

            der Tipp den Alias habe ich umgesetzt und siehe da die fehler im Join gefunden. Nun fiel mir aber noch ein weiteres Problem auf.

            Jeder Lieferant schickt mehrfach im Jahr Lieferung und jedesmal wird ein Eintrag in der Datenbank hinterlegt. Soll heißen es gibt mehrere Einträge zu einem Lieferanten. Es kann also sein das ich die selben Daten bekomme weil ein Lieferant mehrfach am selben Tag geliefert hat.

            Wie kann ich denn das Ergebnis noch weiter verfeinern? Eine Gruppierung habe ich mir gedacht aber die Kriterien sind dafür nicht erfüllbar.
            Deswegen:
            kann man eine Subselection machen die zwei Eigenschaften vergleicht. Sprich such das größte LETZT_LI_DAT und gib mir dazu die LIEF_NR mit

            Code:
            SELECT 
            LIEF_NR
            ,LETZT_LI_DAT
            
            FROM dbo.Datentabelle a 
            WHERE (a.LETZT_LI_DAT and a.LIEF_NR) = (
              SELECT MAX(b.LETZT_LI_DAT),
                          LIEF_NR
              FROM  dbo.Datentabelle b 
              WHERE b.LIEF_NR = a.LIEF_NR
               
            )
            so ungefähr stelle ich mir das vor.*G*

            Ich hoffe ihr könnt es nachvollziehen

            Comment


            • #7
              kann vielleicht jemand helfen? wäre mir sehr wichtig

              Comment


              • #8
                Hallo,
                Originally posted by deathdragon View Post
                ...kann man eine Subselection machen die zwei Eigenschaften vergleicht. Sprich such das größte LETZT_LI_DAT und gib mir dazu die LIEF_NR mit...
                Ja, das geht. Mit den Beispieldaten aus Bei "doppelten" Datensätzen nur einen anzeigen würde das z.B. so aussehen:
                [highlight=sql]
                SELECT a.id, a.name, a.last_use
                FROM doppeltest a
                WHERE (a.last_use, a.name) = (
                SELECT MAX(b.last_use), MAX(b.name)
                FROM doppeltest b
                [/highlight]

                Wobei das in dieser Form nur zur Demonstration der Syntax und Funktionalität dient, mit den Daten aus dem o.g. Bsp. jedoch wenig Sinn macht.

                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


                • #9
                  nein diesmal klappt es leider nicht.

                  bekomme folgende Fehlermeldung
                  An expression of non-boolean type specified in a context where a condition is expected, near ','.

                  auf dein Beispiel bezogen wäre es an folgender Stelle:
                  ...
                  where (a.last_use,a.name) = (...

                  Comment


                  • #10
                    Also, traust Du Dich nicht, das Statement hier hinzuschreiben? Dann ist fröhliches Raten angesagt:
                    Wenn Du immernoch das Statement von oben weiterverwurstest und ich mir die Fehlermeldung durchlese, dann tippe ich mal auf das "and" in der 1. where Bedingung. Sollte stattdessen vielleicht ein Komma hin, damit es zum Subselect passt.
                    Und die nicht agregierten Felder gehören natürlich ins Group by, nur mal so neben by.

                    Originally posted by deathdragon View Post
                    Code:
                    SELECT 
                    LIEF_NR
                    ,LETZT_LI_DAT
                    FROM dbo.Datentabelle a 
                    WHERE (a.LETZT_LI_DAT and a.LIEF_NR) = (
                      SELECT MAX(b.LETZT_LI_DAT),
                                  LIEF_NR
                      FROM  dbo.Datentabelle b 
                      WHERE b.LIEF_NR = a.LIEF_NR
                       
                    )
                    Gruß, defo

                    Comment


                    • #11
                      hallo an alle ich möchte mit einer Subselection folgende Werte bestimmen:



                      select
                      LIEF_NR,
                      VAG_NR,
                      MAX(LETZT_LI_DAT)
                      from dbo.BEKO_DV

                      group by LETZT_LI_DAT,LIEF_NR,VAG_NR

                      Damit möchte ich sehen ob mein Lieferant (LIEF_NR) noch aktiv ist, indem ich mir das höchste letzte Lieferdatum anzeigen lasse (LETZT_LI_DAT).
                      Es kann aber sein das an einem Lieferdatum (an einem Tag) mehrere Lieferungen von ein und dem selben Lieferanten stammen. Um das einzugrenzen dachte ich mir ich nutze die Vorgangsnummer (VAG_NR)
                      mit max(...)

                      Somit würde jede LIEF_NR nur einmal auftauchen.

                      Aber ich habe absolute keine Idee mehr wie ich das noch bewerkstelligen kann.

                      Diese Subselection möchte ich dann in meiner eigentlichen Abfrage einsetzen. Aber ein Schritt nach dem anderen *G*

                      Comment


                      • #12
                        Nochmal, wie funktioniet "Group By"?
                        Das Select Statement (die zu selektierenden Werte) enthält entweder aggregierte Felder (z.B. max(LETZ_LI_DAT) oder nicht aggregierte Felder (hier z.B. LIEF_NR)
                        Der Group By Teil definiert nun, welche Felder gruppiert werden sollen.
                        Faustregel(!): Alle nicht aggregierten Felder des Select Teils, werden im Group By wiederholt.
                        Außerhalb der Faustregel gibt es auch noch andere Möglichkeiten, aber das ist meistens uninteressant. Dein Statement entspricht jedenfalls nicht dieser Regel. Obwohl Du LETZ_LI_DAT mit MAX verarbeitest, taucht es auch im Group By auf.
                        Gruß, defo

                        Comment


                        • #13
                          danke für Group by- Erklärung meine Subselection funktioniert! Teilerfolg

                          Code:
                          USE [DATEN]
                          
                          SELECT     TKA.TEXT_10X30_1, 
                                     PERSAD.ORT, 
                                     PERSAD.STR, 
                                     PERSAD.PLZ, 
                                     PERSAD.BEZ_1, 
                                     PERSAD.BEZ_2, 
                                     PERSAD.PLZ_LA, 
                                     PERSAD.BEZ_3, 
                                     PERSAD.LETZT_AEND, 
                                     L01.BRA_SL, 
                                     L01.TEL_NR, 
                                     L01.TELEFAX_NR, 
                                     L01.LETZT_AEND AS EXPR1, 
                                     L01.STAT_KZ, 
                                     L01.PERSNR, 
                                     L01.QS_FAEHIG, 
                                     L01.BEWERT_KENNZAHL, 
                                     L01.LIEF_NR, 
                                     U12.BRA_TEXT_TAB_1, 
                                     BEKO.VAG_NR,           
                                     BEKO.LETZT_LI_DAT, 
                                     TTD.WERT_VON
                          FROM         
                          	dbo.U12_MV_WO 	as U12 INNER JOIN dbo.L01_DV_WO as L01 ON U12.BRA_SL_WO = L01.BRA_SL 
                          			INNER JOIN dbo.BEKO_DV as BEKO ON L01.LIEF_NR = BEKO.LIEF_NR 
                          			INNER JOIN dbo.PERSAD_DV_WO as PERSAD ON L01.LIEF_NR = PERSAD.KTO_NR 
                          			INNER JOIN dbo.PER_MV as PER ON L01.PERSNR = PER.PERSNR 
                          			INNER JOIN dbo.TTD_DV_WOCO as TTD ON L01.LIEF_NR = TTD.ZLIEF_LIEFNR 
                          			INNER JOIN dbo.TKA_DV as TKA ON TTD.WERT_VON = TKA.WERT_VON
                          			
                          WHERE (L01.LIEF_NR, BEKO.LETZT_LI_DAT)
                          			= 
                          (
                          select  
                          LIEF_NR,
                          MAX(LETZT_LI_DAT)AS LETZT_LI_DAT 
                          
                          FROM [DATEN] .dbo.BEKO_DV b 
                          
                          --where b.LIEF_NR = L01.LIEF_NR and BEKO.LETZT_LI_DAT = b.LETZT_LI_DAT
                          group by b.LIEF_NR)
                          Dabei bekomme ich nun folgende Fehlermeldung:

                          An expression of non-boolean type specified in a context where a condition is expected, near ','.
                          Sprich er kommt mit WHERE (L01.LIEF_NR, BEKO.LETZT_LI_DAT) nicht klar! Aber warum? Werte aus L01.LIEF_NR sind eindeutig und die Subquerry ist korrekt

                          kann wer helfen?

                          Comment


                          • #14
                            Die Syntax ist evtl. bei MS SQL nicht ok.
                            Ich kenne diese Art Joins nur von Oracle, muss aber nichts heißen. Weiß auch nicht, wie sich das nennt bzw. ob die art Joins einen speziellen Namen haben.

                            Also rausfinden, ob die Syntax bei MS SQL geht oder das Subselect in den Hauptjoin reinnehmen.

                            P.S.:
                            Nicht richtig hingeschaut: Zumindest in Oracle gehört ein "IN" anstelle des "=", wenn die Unterabfrage mehre Zeilen liefern kann/soll. Wird nicht mehr als ein Wert erwartet, wäre auch das "=" möglich.
                            Zuletzt editiert von defo; 07.10.2013, 13:28.
                            Gruß, defo

                            Comment


                            • #15
                              Diesen Syntax gibt es in T-SQL nicht. Das sollte sich aber als Where Exists darstellen lassen die dann notwendige Where Clausel im Subselect des Exists hast du ja schonmal kommentiert.

                              Comment

                              Working...
                              X