Entwickler-Ecke
Datenbanken - SQL Abfrage optimieren
Bronstein - Do 28.07.11 19:44
Titel: SQL Abfrage optimieren
Hallo,
ich habe eine Datenbank mit den folgenden zwei Tabellen, sind natürlich mehr aber meine Abfrage soll sich auf diese beiden beschränken:
Tabelle 1: DATEN
Mit den Spalten SERNR, DATUM, NAME, STAT_ID
Tabelle 2: STAT
Mit den Spalten STAT_ID, NAME, TYP
Die SQL-Abfrage soll folgendes Bedingungen erfüllen:
1) Alle SERNR mit dem spätesten DATUM
2) nur die SERNR bei denen der TYP = 1 und das DATUM >= 01.01.2011 ist
3) SERNR die schon beim TYP 99 sind sollen nicht auftauchen
SQL-Anweisung
1: 2: 3: 4:
| SELECT DATEN.SERNR, Max(DATUM) AS DATUM, DATEN.NAME, STAT.TYP FROM DATEN INNER JOIN STAT ON DATEN.STAT_ID = STAT.STAT_ID GROUP BY DATEN.SERNR, DATEN.NAME, STAT.TYP HAVING STAT.TYP<>99 AND (DATUM>= |
Dachte mir die Abfrage in etwa so, doch leider funktioniert dies nicht!
mandras - Do 28.07.11 19:51
a)Welche Datenbanksoftware? Wegen #datum# tippe ich auf Access?
b) Was genau möchtest Du tun?
Ich vermute es gibt einen Status mit bestimmten Namen und Typ,
und 0-n Sätze in DATEN weisen diesen Status auf.
du möchtest für jeden Satz in STAT den Satz aus DATEN
angezeigt bekommen welcher das höchste Datum hat (und weitere Kriterien)?
Bronstein - Do 28.07.11 20:16
Mit Hilfe des Typs ermittlet man in welchem Fertigungschritt das Produkt (Name) ist.
Hier mal ein paar Bsp. Datensätze der Tabelle TYP:
STAT_ID, NAME, TYP
1, Station1, 1
2, Station1, 2
3, Station1, 3
Hier ein paar Bsp. Datensätze der Tabelle DATEN
SERNR, DATUM, NAME, STAT_ID
001, 01.05.2011 05:00, Produkt1, 1
001, 01.05.2011 05:20, Produkt1, 2
001, 01.05.2011 05:50, Produkt1, 3
002, 01.05.2010 05:50, Produkt1, 1
003, 01.05.2011 01:50, Produkt1, 1
003, 01.05.2011 05:50, Produkt1, 99
Hierbei sollte jetzt herauskommen
001, 01.05.2011 05:50, Produkt1, 3
002 nicht, da das Datum vom Stat 1 älter als 01.01.2011 ist
003 nicht, da der Status 99 ist, der Status 99 bedeutet dass das Produkt fehlerhaft war und es somit Ausschuss ist
Hoffe das hilft weiter!
mandras - Do 28.07.11 21:01
Würde dies passen? (hier mal mit Access, andere DBs: Format für Datum anders)
select d1.sernr, d1.datum,d1.name, d1.stat_id from daten d1
where d1.datum=(select max (datum) from daten d2 where d2.sernr=d1.sernr)
and d1.stat_id<>"99" and d1.datum >=#1-1-2011#
Bronstein - Do 28.07.11 21:23
Hi,
nein passt noch nicht. Für die Fallbeispiele die ich gebracht habe passt es kommt das richtige raus:
001, 01.05.2011 05:50, Produkt1, 3
Ändere ich jedoch den ersten Datensatz auf 2010:
001, 01.05.2010 05:00, Produkt1, 1
Kommt trotzdem das gleiche herraus:
001, 01.05.2011 05:50, Produkt1, 3
Ich möchte aber nur die SerNr die dieses Jahr begonnen wurden produziert zu werden, sprich diese Bedingung ist nicht erfüllt:
2) nur die SERNR bei denen der TYP = 1 und das DATUM >= 01.01.2011 ist
mandras - Do 28.07.11 21:33
Ich verstehe nicht ganz...
Gesucht sind die neuesten.. Das ist Satz 3.
Wenn ich nun den "äteren" Satz 1 noch älter mache ändert das nichts
Moment.. Das mit dem Startdatum hast Du jetzt erst gesagt.
SELECT d1.sernr, d1.datum, d1.name2, d1.stat_id
FROM daten AS d1
WHERE d1.datum=(select max (datum) from daten d2 where d2.sernr=d1.sernr)
and d1.stat_id<>"99"
and d1.sernr not in (select sernr from daten where datum <#1-1-2011#)
Bronstein - Do 28.07.11 21:38
Super danke dir,
das mit dem Startdatum habe ich vielleicht etwas unklar ausgedrück. Wollte ich mit dem sagen:
2) nur die SERNR bei denen der TYP = 1 und das DATUM >= 01.01.2011 ist
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!