2016-05-04 10 views
0

Problem ist, dass Datenbank einige Werte fehlt und ich sie in der Kreuztabellenabfrage mit dem nächsten suchen muss.ACCESS - Kreuztabellenabfrage - nächste Übereinstimmung

Die Tabelle, die ich Crosstab scheint wie folgt aus:

Source data

Es hat Werte für Mitbewerberpreise fehlt - 111 Zum Artikel Ich habe nicht Preis für die 3. Woche für den ersten Wettbewerber und für die 2. Woche 2. Konkurrent. Bei Artikel 222 verpasse ich den 2. Wochenpreis für den 1. Teilnehmer und den 1. Preis für den 2. Teilnehmer. Ich möchte den nächsten Wochenpreis in meinen Ausgabedaten verwenden.

Ausgang (für die Preisindexberechnung) wie folgt aussehen muss (Mitbewerberpreise in Spalten, um Berechnungen weiter in Pivot-Tabelle in Excel zu machen):

enter image description here

Die Frage ist, wie man "Lookup" nächste Woche Konkurrenten Preise, markierte ich fehlende Preise in Orange.

Ich hoffe das Problem ist klar, bei Fragen - bitte fragen, ich werde versuchen, alles zu klären! Vielen Dank im Voraus!

Upd. ich versuche, es in der folgenden Art und Weise zu tun (mit Unterabfrage):

 SELECT m_week, item_code, my_price, (SELECT TOP 1 com_price 
    FROM MyTable AS T 
    WHERE T.item_code = MyTable.item_code 
    AND T.m_week <= MyTable.m_week 
    AND competotor_id = 1 
    ORDER BY T.m_week) AS Comp1_price, (SELECT TOP 1 com_price 
    FROM MyTable AS T 
    WHERE T.item_code = MyTable.item_code 
    AND T.m_week <= MyTable.m_week 
    AND competotor_id = 2 
    ORDER BY T.m_week) AS Comp2_price 
    ... the same for each competitor 
    FROM MyTable 

Es funktioniert .. aber sehr langsam und ich brauche für jeden Teilnehmer zum Kopieren/Einfügen. Das nächste, was - ich will die Preise nur suchen, nicht nach unten, sondern auch nach oben (entlang der Wochen)

Antwort

0

Sie Ihre Kreuztabellen- auf einer Abfrage basieren könnten, die Unterabfragen verwendet: SELECT p.competitor_id, p.m_week, p.item_code, p.com_price, p.my_price,
nz(p.com_price, (Select top 1 week_price FROM ( SELECT m_week, item_code, Max(com_price) AS week_price FROM YourTable WHERE com_price Is Not Null GROUP BY m_week, item_code ) as WeekPrices WHERE [item_code]=p.item_code and m_week < p.m_week ORDER BY m_week desc)) as com_price_calc FROM YourTable AS p;

  • Dies führt in der Tabelle mit einer com_price_calc Spalte mit den Nulldaten gefüllt in
  • ich habe Yourtable als p aliased -. für Eltern
  • Die nz() Funktion für den Zugriff ist nur, können Sie es mit IFNULL ersetzen kann() wenn Ihr mit mysql
  • Die innere Unterabfrage zeigt den Wochenpreis für jeder m_week - item_code-Kombination, wobei es nicht null ist.
  • Die äußeren Unterabfragefilter für übergeordnete item_code und eine vorherige Woche und da es "ORDER BY m_week desc" verwendet, gibt top 1 den Wert der vorherigen Wochen zurück.
+0

Grüße und danke! Aber als ich deine Antwort gelesen habe, habe ich gemerkt, dass ich Fehler in der Problembeschreibung gemacht habe. Ich habe eigentlich keine Zeilen mit fehlenden Preisen und ich denke, dass es die erste Frage verkompliziert. –

+0

Vielleicht kann ich irgendwie nz() -Funktion in die Kreuztabellenabfrage hinzufügen. Nun scheint es so 'TRANSFORM Avg (p.com_price) SELECT p.m_week, p.item_code, p.my_price VON MyTable als p GROUP BY p.m_week, p.item_code, p.my_price PIVOT p.competitor_id' –

Verwandte Themen