none
Query String erweitern - Zusätzliche Daten aus anderen Tabelle RRS feed

  • Frage

  • SELECT ItemCode, InStock, MinLevel, InTransit from C_19048801X1
    WHERE ID IN (
    SELECT MAX(ID)
    FROM C_19048801X1
    GROUP BY ItemCode
    )
    order by ItemCode
    
    
    
    

    Habe obigen Query um jeweils den letzten Eintrag aus einer Gruppe zu erhalten. Jetzt würde ich aber noch gern zusätzliche

    Infos für den jeweiligen Artikel "ItemCode" aus der Tabelle OITM "ItemName und FrgnName" dazu haben.

    Freitag, 22. Juli 2011 10:36

Antworten

  • Hallo ToBo-fkb,

    Du kannst die Abfrage auch so gestalten, das die normale Sortierung korrekt angezeigt wird. Dies würde dann so aussehen:

    SELECT * FROM C_19048801X1
    WHERE ID IN
     ( SELECT TOP 10 ID 
     FROM C_19048801X1
     WHERE ItemCode = '487-989-1016'
     ORDER BY ID DESC)
    ORDER BY ID
    



    Gruß Falk
    Falk Krahl
    • Als Antwort markiert ToBo-fkb Sonntag, 24. Juli 2011 16:28
    Samstag, 23. Juli 2011 21:09

Alle Antworten

  • Hallo ToBo-fkb,

    dies erreichst Du indem Du die Tabellen verknüpfst. Dies kann z.B. in dieser Art geschehen:

     

    SELECT A.ItemCode, B.Itemname, A.InStock, A.MinLevel, A.InTransit
    FROM C_19048801X1 A
    INNER JOIN oitm B
    ON A.ItemCode=B.ItemCode
    WHERE ID IN (
    SELECT MAX(ID)
    FROM C_19048801X1
    GROUP BY A.ItemCode
    )
    order by A.ItemCode
    


     


    Gruß Falk
    Falk Krahl
    Freitag, 22. Juli 2011 11:04
  • Oder so:


    with cte as (
    SELECT A.ItemCode, B.Itemname, A.InStock, A.MinLevel, A.InTransit,
    row_number() over (partition by A.ItemCode order by ID desc) as rn
     FROM C_19048801X1 A INNER JOIN oitm B ON A.ItemCode=B.ItemCode
    )
    select * from cte where rn = 1
    Freitag, 22. Juli 2011 15:42
  • Prima und Dankeschön. Mühsam ernärt sich das Eichhörnchen und ich lerne immer mehr.

    Eine letzte Sach für dieses Projekt.

    Wie ich den Letzten Datensatz mit der höchsten ID rausbekomme hab ich schon.

    SELECT ID, ItemCode, InStock, MinLevel, InTransit
    from C_19048801X1
    WHERE ID = (SELECT MAX(ID) FROM C_19048801X1 )
    

    Nun möchte ich aber die letzten 10 Datensätze, bzw. maximal die letzten 10 Datensätze anzeigen, wenn mehr als 10 vorhanden

    sind.

     

    Samstag, 23. Juli 2011 15:55
  • Hi,

    es gibt keine "letzten" Datensätze. Du kannst eine Sortierung einbauen und dann die Anzahl der Ergebnisse mittels

      SELECT TOP 10 ... FROM ...

    einschränken. Das gibt zwar u.U. auch mal mehr als 10 Datensätze zurück, in den meisten Fällen passt es aber.

    Alternativ kannst Du auch

      ROW_NUMBER() OVER ( ... )

    verwenden und dann darüber einschränken.

     


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community
    Samstag, 23. Juli 2011 16:31
    Moderator
  • Ok, ... es gibt eigentlich keine letzten Datensätze. Jeder Datensatz in dieser Tabelle bekommt aber automatisch

    eine ID, die immer, bei einem neuem Datensatz um den Faktor 1 hochgezählt bei wird.  Muss doch jetzt möglich sein,

     einfach die letzten 10 höchtswertigsten ID's auszuwählen . Wenn eben nur 5, oder 9 vorhanden sind, eben diese als

    Ergebnis liefern und maximal die "letzten" 10.

    Oder nicht ?

    Im Prinzip sieht mein Query jetzt so aus

    Select ID, ItemCode
    
    from Tabelle
    
    Where ItemCode = 'abc'
    
    order by ID
    
    
    
    

    Jetzt müsste dort noch integriert werden, dass maximal die letzten 10 ID's angezeigt werden.

     


    Samstag, 23. Juli 2011 16:43
  • Hi,
    Muss doch jetzt möglich sein, einfach die letzten 10 höchtswertigsten ID's auszuwählen. Wenn eben nur 5, oder 9 vorhanden sind, eben diese als Ergebnis liefern und maximal die "letzten" 10.

    im vorigen Posting steht doch, wie das geht. Entweder mit

      SELECT TOP 10 ... FROM <Tabelle> ORDER BY ID DESC

    oder halt per

      ROW_NUMBER() OVER( ORDER BY ID DESC ) AS RowNumber

    und anschließender Einschränkung

      WHERE RowNumber BETWEEN 1 AND 10

    Ein komlettes Beispiel für letzteres findest Du, wenn Du den Link in meinem vorigen Posting anklickst.

    ---

    Ein Hinweis noch: Eine IDENTITY Spalte (also eine, die automatisch hochzählt) beinhaltet nicht zwingend sämtliche Werte in direkter Reihenfolge. Da können auch mehr oder weniger große Lücken entstehen, sei es durch fehlgeschlagene INSERT Statements, Löschen von Datensätzen, ...

     


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community
    Samstag, 23. Juli 2011 17:03
    Moderator
  • Sorry, hatte gar nicht erkannt dass das Links sind.

    Mach das jetzt so:

    SELECT top 10 * from C_19048801X1
    where ItemCode = '487-989-1016'
    Order By ID Desc
    

     

    Samstag, 23. Juli 2011 18:41
  • Hallo ToBo-fkb,

    Du kannst die Abfrage auch so gestalten, das die normale Sortierung korrekt angezeigt wird. Dies würde dann so aussehen:

    SELECT * FROM C_19048801X1
    WHERE ID IN
     ( SELECT TOP 10 ID 
     FROM C_19048801X1
     WHERE ItemCode = '487-989-1016'
     ORDER BY ID DESC)
    ORDER BY ID
    



    Gruß Falk
    Falk Krahl
    • Als Antwort markiert ToBo-fkb Sonntag, 24. Juli 2011 16:28
    Samstag, 23. Juli 2011 21:09
  • Die Daten kommen aus einer Stock Posting Liste, worin sich alle möglichen Lagerbewegungen für diverse "ItemCode" befinden.

    Möchte eben nur die Lagerbewegungen für einen gewissen Artikel in umgekehrter Reihenfolge (Letzte / neuste Bewegung) zuerst

    absteigend anzeigen. Wo ist der Unterschied zwischen Deiner Lösung ? Wenn ich  

    ORDER BY ID DESC
    

    bei mir weglasse, hab ich das gleiche Ergebnis.

     

     

    Sonntag, 24. Juli 2011 06:35
  • . Das gibt zwar u.U. auch mal mehr als 10 Datensätze zurück, in den meisten Fällen passt es aber.y


    Hallo Stefan,

    das ist bei MS Access so, das kann sich bei identischen Datensätzen nicht entscheiden, wann Schluß ist und liefert deswegen auch mal mehr als die gewünschte Anzahl von Datensätzen.

    Beim SQL Server ist es nicht so, der macht genau bei der vorgegebenen Anzahl Schluß.


    Olaf Helper
    * cogito ergo sum * errare humanum est * quote erat demonstrandum *
    Wenn ich denke, ist das ein Fehler und das beweise ich täglich
    Blog Xing
    Sonntag, 24. Juli 2011 06:42
  • Wie kann es denn bei einer ID Spalte, die bei jedem neuem Datensatz inkrementiert wird identische Datensätze geben ?

     

    Sonntag, 24. Juli 2011 08:01
  • Wie kann es denn bei einer ID Spalte, die bei jedem neuem Datensatz inkrementiert wird identische Datensätze geben ?

    Hi,

    dort nicht. Aber es gibt genug Anwendungsfälle, in denen das eben nicht der Fall ist.

     


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community
    Sonntag, 24. Juli 2011 09:50
    Moderator
  • Indem man die ID Spalte nicht mitselektiert, das reicht bei MS Access bereits für das Verhalten (auch wenn das gar nicht das Thema hier ist).
    Olaf Helper
    * cogito ergo sum * errare humanum est * quote erat demonstrandum *
    Wenn ich denke, ist das ein Fehler und das beweise ich täglich
    Blog Xing
    Sonntag, 24. Juli 2011 11:35