SQL neueste x Zeilen mit gleicher Artikelnummer für Durchschnitt betrachten


AlexTM1

Grünschnabel
#1
Hallo,
ich habe ein kleines Problem und weiß nicht genau, wie ich das ohne große Umstände lösen kann.

In einer Tabelle werden nach Produktion Artikelnummer und Herstellungzeit eingetragen.
Für die Planung soll die durchschnittliche Produktionszeit je Artikelnummer berechnet werden. So weit so gut:

SQL:
SELECT     TOP (100) PERCENT Artikelnummer, AVG(DISTINCT min_pro_Stueck) AS [min pro Stueck]
FROM         dbo.Buchungen
GROUP BY Artikelnummer
HAVING      (AVG(DISTINCT min_pro_Stueck) > 0)
Jetzt habe ich zwei Schwierigkeiten:
1. für die Ermittlung des Durchschnitts sollen nur Werte größer 0 beachtet werden (aktuell werden doch Werte betrachtet, deren Durchschnitt über null ist?!)
2. Es sollen nur die letzten 5 Einträge (höchste ID) je Artikelnummer betrachtet werden. Muss ich da mit IN ( SELECT MAX(id) arbeiten?

Vielen Dank für die Hilfe.

Alex
 

Zvoni

Erfahrenes Mitglied
#2
@1) Müsste mit einem WHERE min_pro_stueck>0 gehen (oder ich habe einen Denkfehler)
@2) Wüsste ich jetzt auf Anhieb auch keinen anderen Versuch, wobei ich zugeben muss, dass ich mit der Funktionsweise des TOP-Prädikats nicht vertraut bin. Mein erster Gedanke war, dass ich zuerst über eine ROW_NUMBER die jeweils 5 Sätze pro Artikelnummer ziehe, und dann den AVG bilde.
Also etwas in der Art (Aircode!) (wobei ich mir ziemlich sicher bin, dass das WHERE RN<=5 an der falschen Stelle steht)
SQL:
SELECT tmp.Artikelnummer, AVG(tmp.Menge) FROM
(SELECT
Artikelnummer,
Menge,
ROW_NUMBER() PARTITION OVER(Artikelnummer ORDER BY ID DESC) AS RN
FROM Tabelle WHERE Menge>0) AS tmp
WHERE tmp.RN<=5
GROUP BY tmp.Artikelnummer
EDIT: Hab ein wenig am SQL noch rumgefrickelt. Keine Ahnung obs richtig ist, aber ich denke du verstehst den Ansatz
 
Zuletzt bearbeitet:

Zvoni

Erfahrenes Mitglied
#3
2. Versuch (Aircode). Die Having-Klausel brauchst du dann nicht, da der Durchschnitt definitiv>0 sein wird
SQL:
SELECT tmp.Artikelnummer, AVG(tmp.Menge) FROM
(SELECT
     T1.Artikelnummer,
     T1.Menge,
     T2.RN
     FROM
     Tabelle AS T1
     INNER JOIN
     (SELECT Artikelnummer,
     ROW_NUMBER() PARTITION OVER(Artikelnummer ORDER BY ID DESC) AS RN
     FROM Tabelle) AS T2
     ON
     T1.Artikelnummer=T2.Artikelnummer AND
     T2.RN<=5
     WHERE T1.Menge>0) AS tmp
 GROUP BY tmp.Artikelnummer
 

Neue Beiträge