Was Du in #5 gemacht hast, das Subselect aus der Select Clause in den Join verschieben geht in der Form nicht. Der Bezug zu IA fehlt da innen drin, man kann da drinnen nichts referenzieren, was draußen in der Nachbarmenge liegt.
Das geht nur beim Subselect in der Select Clause, wie Du es vorher hattest oder auch mit CTE, wie vorgeschlagen, aber da ist mir auf die Schnelle nichts zu eingefallen.
Die Subselects wie Du es gemacht hast, sind praktisch, aber nicht die schnellsten. Für jeden Satz der Hauptmenge wird das Subselect neu gemacht.
Wenn man das Subselect als separaten Join baut, läuft das eleganter. Man muss allerdings die Joinkriterien mit nach außen legen.
Und dass ein First dann keinen Sinn mehr ergibt, weil eine große Ergebnismenge erzeugt wird, ist dann auch klar.
Was ich bei Dir in #5 nicht verstehe, was die Aggregate im äußeren Select sollen. Mir ist allerdings auch nicht klar, wie die Tabelle ItemAct strukturiert ist und was es mit der qty auf sich hat.
Ich würde es so versuchen:
Code:
SELECT IA.ItemId, IA.Item, IA.Qty, CP1.CP Costo
FROM ItemAct IA join
(select f.itemid, f.cp, f.fecha, f.LOCATION -- Eintrag am nächstem zum Stichtag mit CP
from cp_fecha f join
(SELECT ItemId , LOCATION, max(fecha) as fechamax -- Eintrag am nächstem zum Stichtag
FROM Cp_Fecha -- cp fehlt noch
WHERE Fecha <= :cp_param
group by itemid, LOCATION) fm
on f.itemid = fm.itemid
and f.fecha = fm.fechamax
and f.LOCATION = fm.LOCATION) CP1
on cp1.ItemID = IA.ItemID;
Ob die Location bei der Sache eine Rolle spielt oder nicht, musst Du selber wissen, wenn nicht dann raus.
Habe die
query probiert, die braucht aber sehr lange.
Für die Bewegungen des Inventars nutzt unser Programm eine Tablle ItemAct (Item Accounting nehme ich mal an, der Name kam schon so als ich in die Firma gekommen bin).
Qty (Quantity) ist die Menge, die pro Datensatz bewegt wird. Da steht dann z.B. drin dass zur Datum (Fecha) X das Produkt (Item) A -5 Einheiten durch das Document Y den Inventar der Bodega (das ist sowas wie eine Lagerhalle) entzogen wurden (zum Bsp durch Verkauf).
Mache ich dann SUM(Qty) zu einem Stichtag, danns ehe ich, wieviele Einheiten ich da zur Verfügung habe und die Idee ist ja, den Durchschnittspreis (Costo promedio = CP) daneben zu schreiben.
Sorry wenn mir machmal die Worte auf deutsch nicht geläufig sind, aber in Deutschland habe ich fast nichts in Warenwirtschaften programmiert, alles was ich darüber weiss ist eigentlich in spanisch.