Announcement

Collapse
No announcement yet.

SQL-Abfrage: Höchsten Wert ausgeben

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

  • SQL-Abfrage: Höchsten Wert ausgeben

    Hallo Zusammen!

    Ich habe hier ein Problem mit einer SQL-Abfrage aus MS SQL Server 2005.
    Es sollen alle Rechnungspositionen von bestimmten Kunden aufgelistet werden. Da jedoch die Kunden Artikel mehrmals kauften, gibt es hierzu mehrere Datensätze mit unterschiedlichem Datum. Ich brauche aber nur das letzte Datum.

    Hier meine bisherige Abfrage im SQL:
    Code:
    SELECT RECHNUNGPOS.ARTIKEL, RECHNUNG.FIRMA, RECHNUNGPOS.MENGE, RECHNUNGPOS.NETTO,  RECHNUNG.DATUM
    FROM Datenbank.dbo.RECHNUNG RECHNUNG, Datenbank.dbo.RECHNUNGPOS RECHNUNGPOS
    WHERE RECHNUNG.RECHNUNG = RECHNUNGPOS.RECHNUNG AND ((RECHNUNG.ADRESSE Not In ('100001.15','100002.01','100002.02')) AND (RECHNUNG.STATUS In (4,3)) AND (RECHNUNG.ART='R') AND (RECHNUNG.FIRMA In (100011,100022,100051,100065,100900,100921,101088)))
    Die Ausgabe würde so passen, wenn da nur der letzte Datensatz (höchstes Datum) ausgegeben würde. Die Spalte dazu wäre RECHNUNG.DATUM

    Leider bin ich (noch) nicht so fit in SQL, daher bräuchte ich hier ein wenig Hilfe.

    Vielen Dank im Voraus!

    Gruß
    Tobias

  • #2
    Originally posted by tobiasu View Post
    Hallo Zusammen!

    Ich habe hier ein Problem mit einer SQL-Abfrage aus MS SQL Server 2005.
    Es sollen alle Rechnungspositionen von bestimmten Kunden aufgelistet werden. Da jedoch die Kunden Artikel mehrmals kauften, gibt es hierzu mehrere Datensätze mit unterschiedlichem Datum. Ich brauche aber nur das letzte Datum.

    Hier meine bisherige Abfrage im SQL:
    Code:
    SELECT RECHNUNGPOS.ARTIKEL, RECHNUNG.FIRMA, RECHNUNGPOS.MENGE, RECHNUNGPOS.NETTO,  RECHNUNG.DATUM
    FROM Datenbank.dbo.RECHNUNG RECHNUNG, Datenbank.dbo.RECHNUNGPOS RECHNUNGPOS
    WHERE RECHNUNG.RECHNUNG = RECHNUNGPOS.RECHNUNG AND ((RECHNUNG.ADRESSE Not In ('100001.15','100002.01','100002.02')) AND (RECHNUNG.STATUS In (4,3)) AND (RECHNUNG.ART='R') AND (RECHNUNG.FIRMA In (100011,100022,100051,100065,100900,100921,101088)))
    Die Ausgabe würde so passen, wenn da nur der letzte Datensatz (höchstes Datum) ausgegeben würde. Die Spalte dazu wäre RECHNUNG.DATUM

    Leider bin ich (noch) nicht so fit in SQL, daher bräuchte ich hier ein wenig Hilfe.

    Vielen Dank im Voraus!

    Gruß
    Tobias
    GROUP BY und MAX ():
    [HIGHLIGHT="SQL"]SELECT RECHNUNGPOS.ARTIKEL
    , RECHNUNG.FIRMA
    , RECHNUNGPOS.MENGE
    , RECHNUNGPOS.NETTO
    , MAX (RECHNUNG.DATUM)
    FROM Datenbank.dbo.RECHNUNG RECHNUNG
    , Datenbank.dbo.RECHNUNGPOS RECHNUNGPOS
    WHERE RECHNUNG.RECHNUNG = RECHNUNGPOS.RECHNUNG
    AND ((RECHNUNG.ADRESSE Not In ('100001.15','100002.01','100002.02'))
    AND (RECHNUNG.STATUS In (4,3))
    AND (RECHNUNG.ART='R')
    AND (RECHNUNG.FIRMA In (100011,100022,100051,100065,100900,100921,101088) ))
    GROUP BY RECHNUNGPOS.ARTIKEL
    , RECHNUNG.FIRMA
    , RECHNUNGPOS.MENGE
    , RECHNUNGPOS.NETTO[/HIGHLIGHT]

    PS: Formatierung von SQL in Beiträgen

    Comment


    • #3
      Hallo ebis!

      Danke für deine Hilfe.

      Leider bekomm ich damit auch wieder alle Datumswerte raus.

      Hier meine Abfrage:
      [highlight=sql]SELECT RECHNUNGPOS.ARTIKEL
      , RECHNUNG.FIRMA
      , RECHNUNGPOS.MENGE
      , RECHNUNGPOS.NETTO
      , MAX(RECHNUNG.DATUM)
      FROM Datenbank.dbo.RECHNUNG RECHNUNG
      , Datenbank.dbo.RECHNUNGPOS RECHNUNGPOS
      WHERE RECHNUNG.RECHNUNG = RECHNUNGPOS.RECHNUNG
      AND ((RECHNUNG.ADRESSE Not In ('100001.15','100002.01','100002.02'))
      AND (RECHNUNG.STATUS In (4,3))
      AND (RECHNUNG.ART='R')
      AND (RECHNUNG.FIRMA In (100011,100022,100051,100065,100900,100921,101088) ))
      GROUP BY RECHNUNGPOS.ARTIKEL
      , RECHNUNG.FIRMA
      , RECHNUNGPOS.MENGE
      , RECHNUNGPOS.NETTO[/highlight]

      Und hier ein Ausschnitt vom Ergebnis:
      Code:
      ARTIKEL   FIRMA       MENGE     NETTO     DATUM
      102105	100179	6,00	10,40	2004-10-08 00:00:00,000
      102105	100179	6,00	11,40	2004-10-08 00:00:00,000
      102105	100179	10,00	10,61	2005-07-29 00:00:00,000
      102105	100179	10,00	10,67	2006-08-31 00:00:00,000
      102110	100262	2,00	9,50	2007-10-18 00:00:00,000
      102110	100262	4,00	10,17	2008-06-30 00:00:00,000
      102111	100179	4,00	11,46	2006-04-28 00:00:00,000
      102111	100179	4,00	12,13	2007-10-31 00:00:00,000
      102111	100179	6,00	13,38	2008-08-26 00:00:00,000
      102111	100179	10,00	11,25	2004-06-04 00:00:00,000
      102111	100179	10,00	12,13	2006-08-31 00:00:00,000
      102111	100202	10,00	13,38	2009-07-09 00:00:00,000
      102111	100262	2,00	12,50	2007-10-18 00:00:00,000
      102111	100262	2,00	13,38	2009-02-11 00:00:00,000
      102204	100262	2,00	15,00	2007-10-18 00:00:00,000
      102215	100262	2,00	12,50	2007-10-18 00:00:00,000
      102215	100262	4,00	13,38	2008-06-30 00:00:00,000
      102220	100179	6,00	13,30	2005-01-27 00:00:00,000
      102221	100179	2,00	8,90	2004-03-31 00:00:00,000
      102221	100179	4,00	8,39	2005-01-27 00:00:00,000
      102228	100179	2,00	10,00	2004-06-04 00:00:00,000
      102234	100179	4,00	13,95	2005-01-27 00:00:00,000
      102234	100179	4,00	14,21	2006-04-28 00:00:00,000
      102234	100179	6,00	14,21	2006-12-14 00:00:00,000
      102234	100179	6,00	14,65	2005-07-29 00:00:00,000
      102234	100179	10,00	14,55	2006-08-31 00:00:00,000
      102234	100202	10,00	16,53	2009-07-09 00:00:00,000
      102234	100262	2,00	15,00	2007-02-26 00:00:00,000
      102234	100426	6,00	14,65	2005-11-29 00:00:00,000
      102234	100428	2,00	11,00	2007-02-28 00:00:00,000
      102234	100428	8,00	11,00	2006-10-24 00:00:00,000
      102234	100428	10,00	11,00	2006-10-24 00:00:00,000
      102234	100428	20,00	10,50	2008-01-31 00:00:00,000
      102240	100179	6,00	9,73	2005-01-27 00:00:00,000
      102240	100179	10,00	9,73	2005-01-27 00:00:00,000
      Hab ich hier irgendwo einen Hänger?
      Das Datum wird immer vom ERP-System geschrieben. Kann es sein, das es da vielleicht an der Formatierung liegt?

      Vielen Dank im Voraus für die Hilfe!

      Gruß
      Tobias

      Comment


      • #4
        2.Versuch: wobei RECHNUNG abgekürzt zu R und RECHNUNGPOS zu P
        [HIGHLIGHT="SQL"] SELECT P.ARTIKEL
        , R.FIRMA
        , P.MENGE
        , P.NETTO
        FROM Datenbank.dbo.RECHNUNGPOS AS P
        JOIN ( SELECT R.Firma
        , R.Rechnung
        , MAX(R.DATUM)
        FROM Datenbank.dbo.RECHNUNG AS R
        GROUP BY R.FIRMA, R.Rechnung
        ) AS R ON R.RECHNUNG = P.RECHNUNG
        WHERE
        AND ((R.ADRESSE NOT IN ('100001.15','100002.01','100002.02'))
        AND (R.STATUS IN (4,3)) AND (R.ART='R')
        AND (R.FIRMA IN (100011,100022,100051,100065,100900,100921,101088) ))
        [/HIGHLIGHT]

        Comment


        • #5
          Hallo ebis!

          Hier bekomm ich auch wieder alle Datensätze raus.

          Hier zum gegenlesen kurz der Code:
          [highlight=sql]SELECT RECHNUNGPOS.ARTIKEL
          , RECHNUNG.FIRMA
          , RECHNUNGPOS.MENGE
          , RECHNUNGPOS.NETTO
          FROM P2PlusProd.dbo.RECHNUNGPOS AS RECHNUNGPOS
          JOIN ( SELECT RECHNUNG.Firma
          , RECHNUNG.Rechnung
          , MAX(RECHNUNG.DATUM)
          FROM P2PlusProd.dbo.RECHNUNG AS RECHNUNG
          GROUP BY RECHNUNG.FIRMA, RECHNUNG.Rechnung)
          AS RECHNUNG ON RECHNUNG.RECHNUNG = RECHNUNGPOS.RECHNUNG
          WHERE
          AND ((RECHNUNG.ADRESSE NOT IN ('100001.15','100002.01','100002.02'))
          AND (RECHNUNG.STATUS IN (4,3))
          AND (R.ART='R')
          AND (RECHNUNG.FIRMA IN (100011,100022,100051,100065,100078,100080,100103
          ,100178,100179,100180,100192,100197,100198,100201
          ,100202,100208,100214,100229,100233,100244,100245
          ,100249,100252,100262,100269,100422,100423,100426
          ,100428,100446,100505,100589,100708,100813,100818
          ,100828,100900,100921,101088)))[/highlight]

          Und hier das Ergebnis dazu:
          Code:
          DATUM                                      ARTIKEL   FIRMA      MENGE     NETTO
          2004-10-08 00:00:00,000	102105	100179	6,00	10,40
          2004-10-08 00:00:00,000	102105	100179	6,00	11,40
          2005-07-29 00:00:00,000	102105	100179	10,00	10,61
          2006-08-31 00:00:00,000	102105	100179	10,00	10,67
          2007-10-18 00:00:00,000	102110	100262	2,00	9,50
          2008-06-30 00:00:00,000	102110	100262	4,00	10,17
          2006-04-28 00:00:00,000	102111	100179	4,00	11,46
          2007-10-31 00:00:00,000	102111	100179	4,00	12,13
          2008-04-30 00:00:00,000	102111	100179	6,00	13,38
          2008-08-26 00:00:00,000	102111	100179	6,00	13,38
          2004-06-04 00:00:00,000	102111	100179	10,00	11,25
          2006-08-31 00:00:00,000	102111	100179	10,00	12,13
          2009-07-09 00:00:00,000	102111	100202	10,00	13,38
          2007-10-18 00:00:00,000	102111	100262	2,00	12,50
          2009-02-11 00:00:00,000	102111	100262	2,00	13,38
          2007-10-18 00:00:00,000	102204	100262	2,00	15,00
          2007-10-18 00:00:00,000	102215	100262	2,00	12,50
          2008-06-30 00:00:00,000	102215	100262	4,00	13,38
          2004-03-31 00:00:00,000	102220	100179	6,00	13,30
          2005-01-27 00:00:00,000	102220	100179	6,00	13,30
          2004-03-31 00:00:00,000	102221	100179	2,00	8,90
          2005-01-27 00:00:00,000	102221	100179	4,00	8,39
          2004-06-04 00:00:00,000	102228	100179	2,00	10,00
          2005-01-27 00:00:00,000	102234	100179	4,00	13,95
          2006-04-28 00:00:00,000	102234	100179	4,00	14,21
          2006-12-14 00:00:00,000	102234	100179	6,00	14,21
          2005-07-29 00:00:00,000	102234	100179	6,00	14,65
          2006-08-31 00:00:00,000	102234	100179	10,00	14,55
          2009-07-09 00:00:00,000	102234	100202	10,00	16,53
          2007-02-26 00:00:00,000	102234	100262	2,00	15,00
          2005-11-29 00:00:00,000	102234	100426	6,00	14,65
          2007-02-28 00:00:00,000	102234	100428	2,00	11,00
          2006-03-09 00:00:00,000	102234	100428	8,00	11,00
          2006-10-24 00:00:00,000	102234	100428	8,00	11,00
          2006-10-24 00:00:00,000	102234	100428	10,00	11,00
          2008-01-31 00:00:00,000	102234	100428	20,00	10,50
          Kann es sein, das es daran liegt, das es für die Kombination Artikel-Kunde verschiedene Preise gibt?

          Comment


          • #6
            Hi,

            ich mache Dir mal ein kleines Beispiel, wo es nur ums Prinzip geht, wie man nach dem größten Datum abfragt:

            Es gibt eine Tabelle mit den Feldern Name,Vornamen und Datum.
            Namen können mehrfach vorkommen. Gesucht werden alle Namen mit dem jeweils höchsten Datum und dem dazugehörigen Vornamen. Wenn es jetzt einen Hans Meier gibt und einen Franz Meier und der Franz hat das größere Datum, will man nur den Franz haben:

            Select T1.Name,T1.Vorname,T1.Datum from Tabelle T1
            where T1.Datum=
            (select max(t2.Datum) from Tabelle T2 where T1.Name=T2.Name)

            Gruß
            Zuletzt editiert von frauwue; 14.08.2009, 19:03. Reason: Ergänzung
            docendo discimus

            Comment

            Working...
            X