Taotse 0 Geschrieben 29. Januar 2013 Melden Teilen Geschrieben 29. Januar 2013 (bearbeitet) Erst mal Hallo zusammen! Ich habe folgende Problemstellung. Wir verwalten aktuell ca 450.000 Artikel, jeweils zum 1. und 15. eines Monats werden bei einzelnen Artikeln Preise (Ek, Vk usw) geändert, es kommen Neue hinzu bzw. Alte fliegen raus. Kann mir jemand auf die Sprünge helfen, wie ich es anstellen kann eine Struktur zu entwickeln um zu jedem beliebigen Zeitpunkt die Preise für Artikel xyz zu erhalten? Historisch bedingt, werden aktuell alle 450.000 Artikel mit dem jeweilig gültigen Preis weggeschrieben was die DB unglaublich aufbläst. Grüße T. PS: Achja, DB ist Server 2012 Std. bearbeitet 29. Januar 2013 von Taotse Zitieren Link zu diesem Kommentar
Dunkelmann 96 Geschrieben 29. Januar 2013 Melden Teilen Geschrieben 29. Januar 2013 Im Prinzip benötigst Du jeweils eine kleine EK bzw. VK Historie zu jedem Artikel als Tabelle. Ob es ein oder zwei Tabellen sein müssen bzw. sollten hängt von dem Rest der DB ab. So könnte es aussehen: [Konzern/Firma/Mandant/Lagerort etc.], [ArtikelNr], [EK/VK Kennzeichen], [Preis ggf. Währung], [gültig von], [gültig bis], eventuell noch Zusätze wie [geändert von], [geändert am], [status] etc. Zitieren Link zu diesem Kommentar
Taotse 0 Geschrieben 30. Januar 2013 Autor Melden Teilen Geschrieben 30. Januar 2013 Hallo Dunkelmann! Vielen Dank für die Antwort. im Groben enstpricht das was Du vorschlägst unserem aktuellen Schema. Problem an der Sache ist folgendes - Nehmen wir an, Artikel A wurde am 01.06.2012 ins Sortiment aufgenommen und hat seither den gleichen Preis. Artikel B wurde am 01.01.2012 ins Sortiment aufgenommen, hatte am 15.03. eine Preiserhöhung und am 15.04.2012 eine Preissenkung. Abfrage (vereinfacht) des gültigen Preises zum 01.09.2012: SELECT a.ArtikelNr, b.Ek, b.Vk FROM dbo.Artikel a INNER JOIN dbo.Preise b ON (a.GUID=b.ArtikelID) WHERE a.ArtikelNr IN (A, B) AND AenderungsDatum='01.09.2012' Ergebnis dürfte NULL sein. Grüße T. Zitieren Link zu diesem Kommentar
Dukel 454 Geschrieben 30. Januar 2013 Melden Teilen Geschrieben 30. Januar 2013 Wieso suchst du nach dem Änderungsdatum? Nimm doch immer die neuesten Daten eines Artikels. Ggf. mit einem Trigger o.ä. in der Haupttabelle den Preis ändern (und in dieser dann immer nur den Aktuellen Preis mitnehmen) und die Historie in der anderen Tabelle pflegen. Zitieren Link zu diesem Kommentar
Taotse 0 Geschrieben 30. Januar 2013 Autor Melden Teilen Geschrieben 30. Januar 2013 (bearbeitet) genau um diese Historie geht es ja. Ich brauche einfach die Artikeldaten bzw. Preise zum Zeitpunkt X für statistische Zwecke und Auswertungen. Eine "Stammtabelle" mit aktuellen Eigenschaften und Preisen existiert logischer weise. bearbeitet 30. Januar 2013 von Taotse Zitieren Link zu diesem Kommentar
Dukel 454 Geschrieben 30. Januar 2013 Melden Teilen Geschrieben 30. Januar 2013 Im Beispiel von von Dunkelmann gibt es das Gültig von / Gültig bis. Dort kannst du filtern nach Datum größer als "Gültig von" und Datum kleiner als "Gültig bis". Oder du pflegst nur das Änderungsdatum, sortierst nach diesem, filterst nach alles was vor dem gesuchten Datum ist und nimmst den ersten Eintrag (oder so ähnlich, falls ich etwas durcheinandergekommen bin beim größer und kleiner...) Zitieren Link zu diesem Kommentar
hh2000 10 Geschrieben 5. Februar 2013 Melden Teilen Geschrieben 5. Februar 2013 Moin, wie Dukel schon schrieb, gibt es min. 2 Varianten: 1. Mit DatumVon und DatumBis in der Preistabelle - es muss bei der Eingabe drauf geachtet werden, dass keine "Lücken" im Datum entstehen - einfachere Abfrage 2. ÄnderungsDatum - einfacheres Eingeben - kompliziertere Abfrage Beispiel für Nr. 2: T_Artikel --------------------[ArtikelID] Primary Key[ArtikeName]T_Preis ---------------------[PreisID] Primary Key[ArtikelID] Foreign Key, verweist auf ArtikelID in Tabelle T_Artikel[GueltigAb][Preis]Abfrage zum ermitteln des Preises zum Zeitpunkt XX (könnte auch in der Zukunft liegen):SELECT a.ArtikelID, a.ArtikelName, (SELECT TOP 1 p.Preis FROM T_Preis p WHERE a.ArtikelID = p.ArtikelID AND p.GueltigAb <= XX ORDER BY p.GueltigAb DESC ) AS PreisFROM T_Artikel aWHERE a.ArtikelID = 123456789 Artikel die noch keinen Preis haben, werden mit NULL in der Spalte [Preis] angezeigt. Gruß Kai Zitieren Link zu diesem Kommentar
Empfohlene Beiträge
Schreibe einen Kommentar
Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.