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>=#01.01.2011# and TYP=1)


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