Zum Inhalt springen

Wieder hilfe bei Datenbankabfrage...


AJRames

Empfohlene Beiträge

Hi Leute! Ich weiss wieder nicht wie ich das lösen sollt.

Folgender Aufbau. Ich habe Firmen in der Datenbank. Diese Firmen besitzen mehrere Produkte. Auf diese gekauften Produkte haben die Firmen jeweils Supportverträge.

Z.b. Die Firma "FISI" hat ein Produkt "EINS" dessen Support am 31.05.2009 endet. und ein Produkt namens "ZWEI" dessen Support am 31.06.2009 endet.

Nun möchte ich mit meiner Abfrage alle Firmen (und deren infos) ausgeben bei denen ein Produkt bis zum 31.07.2009 ausläuft.

Theoretisch so ähnlich:

SELECT DISTINCT KDNR FROM TABELLE WHERE SUPPORT < '31.07.2009'

liefert das korrekte Ergebnis. Aber ich benötige mehr als nur die KDNR...

Ein SELECT DISTINCT * geht ja nicht....

SELECT * FROM TABELLE WHERE SUPPORT < '31.07.2009');

Zeigt mir die eine Firma öfter an...das sollte auch nicht sein...

Ich brauche die Firma nur einmal, damit ich weiß das bei Firma "Heinz" der support bis zum 31.07.2009 ausläuft.

Jemand ne Idee?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ja Group by hab ich mir auch gedacht, aber das kann ich meines wissens nur auf aggregatsfunktionen anwenden, das geht hier ja nicht.... (so ganz unwissend bin ich dann doch nicht ^^ )

@Amstelchen: Jep, ist ein Datumsfeld.

Eigentlich führe ich die Abfrage auf einer Tabelle durch.

Diese hat die Spalten: KDNR, Produkt, noch einige, Support.

Ich bräucht die Infos vom "ältesten" (wenn mans so nennen will)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich bräucht die Infos vom "ältesten" (wenn mans so nennen will)
Aus dem Bauch heraus:

select min(datefield), customer_id from source group by customer_id

Dann im zweiten Schritt mit den Daten weiterarbeiten, evtl. zweiten Request durchführen oder eine nested query verwenden.

Link zu diesem Kommentar
Auf anderen Seiten teilen

SELECT * FROM (SELECT MAX(SUPPORT) AS SUPPORT, KDNR FROM TABELLE GROUP BY KDNR) WHERE SUPPORT < '"+end+"';

'end' ist hierbei das Datum das ich manuell in mein Programm eingebe.

Prizipiell ists das! Doch ich kann nicht mehr Als KDNR und das Supportdatum ausgeben. Ich bräuchte eigentlich dort auch alle felder.....Also:

SELECT * FROM (SELECT * , MAX(SUPPORT) AS SUPPORT FROM....

Aber das nimmter nicht weil ja Support in dem * auch drin ist...

Sobald ich mehr eingeb, gibts ne Fehlermeldung, zb:

SELECT * FROM (SELECT MAX(SUPPORT) AS SUPPORT, KDNR, ANSPRECHPARTNER... FROM ...

Fehler: Not in aggregate function or group by clause...

Link zu diesem Kommentar
Auf anderen Seiten teilen

Wenn ichs es richtig verstehe dann sind Firmen und Produkte in einer Tabelle zusammengespeichert?

Meine Empfehlung wäre diese "Tabelle" zu normalisieren und diese Daten zu trennen.

Wenn Du es nicht kannst oder besser gesagt nicht darfst dann solltest Du in deinem Select Statement ein Bisschen vom "*" weg denken dann klappt das schon.

ZB:


SELECT DISTINCT tab.kdnr

               ,tab.kdname

               ,tab.[alle weitere Spalten die [B][COLOR="Red"]nur [/COLOR][/B]mit dem Kunden zu tun haben]

FROM tabelle tab

WHERE tab.suport < '31.07.2009'

Ein weiterer Hinweis: Je nach DBMS musst Du das 'Datum' IN ein echtes Datum umwandeln. Meistens wird ein implizites Casting vorgennomen aber drauf verlassen sollte man sich nicht.

Manch mal ist nämlich der "01.12.2009' ganz schnell der 12. Januar. ;)

Link zu diesem Kommentar
Auf anderen Seiten teilen

der fehler an solchen ansätzen ist halt oftmals, dass unbedarfte anfänger wider besseren wissens viele dinge implementieren, die die datenbank ohnehin schon seit jahrzehnten als feature anbietet.

datumsfelder die aber als textfelder angelegt werden, in denen z.b. der 32. (sic!) des monats kein problem darstellt und die durch falsch angelegte sortieralgorithmik dann auch daten falsch verarbeiten, sind da nur die spitze des eisberges, an denen natürlich auch grosse schiffe (=projekte) untergehen können.

es kann hier eben niemals schaden, sich mit den grundlagen (philosophie einer datenbank, normalisierung, relationalität, unterstützte datentypen, spezifika des eingesetzten DBMS) auseinanderzusetzen, bevor man überhaupt eine zeile code schreibt.

aber darüber wurden auch schon bücher geschrieben.

s'Amstel

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...