AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken SQL - Nach nicht direkt gegebenem Datum suchen
Thema durchsuchen
Ansicht
Themen-Optionen

SQL - Nach nicht direkt gegebenem Datum suchen

Ein Thema von e-gon · begonnen am 7. Apr 2016 · letzter Beitrag vom 8. Apr 2016
Antwort Antwort
e-gon

Registriert seit: 7. Jul 2003
Ort: Stuttgart
163 Beiträge
 
Delphi 6 Enterprise
 
#1

SQL - Nach nicht direkt gegebenem Datum suchen

  Alt 7. Apr 2016, 08:44
Datenbank: MS Access • Version: 2007 • Zugriff über: TADOQuery
Hallo,

ich habe da ein SQL-Problem mit MS Access:
Relationale Datenbank mit zwei Tabellen. Tabelle 1 enthält Artikel, Tabelle 2 Preise, die ab einem bestimmten Datum galten.

Beispiel für Tabelle 2:
ArtikelID Datum Preis
1 01.01.2016 3,29
1 24.01.2016 3.19
1 11.02.2016 3,31
1 03.03.2016 3,35
1 01.04.2016 3,39

Will ich jetzt wissen, wie hoch der Preis für den Artikel mit der ArtikelID 1 am 26.02.2016 war, kann ich das ja mit Hilfe des "Top"-Befehls (unter mySQL "Limit"-Befehl) einfach lösen:
Code:
SELECT Top 1 PREISE.Preis FROM PREISE WHERE PREISE.ArtikelID=1 AND PREISE.Datum<=#02/26/2016# ORDER BY PREISE.Datum DESC;
Brauche ich allerdings eine Liste aller Artikel, hilft mir der Top-Befehl nicht weiter, da mir immer nur der erste Artikel angezeigt wird:
Code:
SELECT Top 1 PREISE.Preis FROM PREISE WHERE PREISE.Datum<=#02/26/2016# ORDER BY PREISE.Datum DESC;
Wie kann ich solch eine Liste erstellen oder unter welchem Stichwort finde ich passende Antworten?

Gruß
e-gon

PS: Wie bekommt man denn die Spalten in eine Tabelle?
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#2

AW: SQL - Nach nicht direkt gegebenem Datum suchen

  Alt 7. Apr 2016, 08:54
Im ersten Moment fällt mir das hier ein:

Code:
SELECT
  artikel.ID,
  (SELECT Top 1 PREISE.Preis FROM PREISE WHERE PREISE.ArtikelID=artikel.ID AND PREISE.Datum<=#02/26/2016# ORDER BY PREISE.Datum DESC) as preis
FROM artikel
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Benutzerbild von baumina
baumina

Registriert seit: 5. Mai 2008
Ort: Oberschwaben
1.275 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: SQL - Nach nicht direkt gegebenem Datum suchen

  Alt 7. Apr 2016, 08:54
Select auf Artikel-Tabelle, in der Feldliste eine Subquery mit Top auf die Preistabelle.

So in etwa:
SQL-Code:
select art.*, (select Preis from Preise where ArtikelID=art.ArtikelID and ....) Preis
from Artikel art
where ...
Hinter dir gehts abwärts und vor dir steil bergauf ! (Wolfgang Ambros)
  Mit Zitat antworten Zitat
e-gon

Registriert seit: 7. Jul 2003
Ort: Stuttgart
163 Beiträge
 
Delphi 6 Enterprise
 
#4

AW: SQL - Nach nicht direkt gegebenem Datum suchen

  Alt 7. Apr 2016, 16:37
Hallo,

erstmal danke für die Antworten. Wie es aussieht ist es doch kein Problem von der Stange.

Der zeitliche Aufwand ist natürlich bei solch eine Mehrfachabfrage recht groß. Ich muss mal ausprobieren, ob das noch akzeptabel ist.

Aber schon Mal danke für die Hilfe!

Gruß
e-gon
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#5

AW: SQL - Nach nicht direkt gegebenem Datum suchen

  Alt 7. Apr 2016, 17:06
Keine Ahnung, ob Access das kann, aber meinst Du sowas?
Delphi-Quellcode:
select *
from Preise a, Artikel c
where a.ArtikelID = c.ArtikelID
and c.Datum = b.Datum
and exists
(
  select b.ArtikelID, max(b.Datum) as Datum
  from Preis b
  where b.datum <= #02/26/2016#
  and b.ArtikelID = a.ArtikelID
  group by b.ArtikelID
)
order by a.datum desc
Bei genauerer Überlegung wird es das wohl eher nicht sein.

Meiner Meinung nach solltest Du als erstes der Tabelle 2 auch einen eindeutigen Schlüssel "verpassen", damit ein Datensatz über diesen auch eindeutig angesprochen werden kann.

Geändert von nahpets ( 7. Apr 2016 um 17:35 Uhr) Grund: Nach 'nem weiteren "Denkversuch" ein bisserl angepasst.
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#6

AW: SQL - Nach nicht direkt gegebenem Datum suchen

  Alt 7. Apr 2016, 17:48
Hallo,
erstmal danke für die Antworten. Wie es aussieht ist es doch kein Problem von der Stange.
Der zeitliche Aufwand ist natürlich bei solch eine Mehrfachabfrage recht groß. Ich muss mal ausprobieren, ob das noch akzeptabel ist.
Wie viele Datensätze erwartest du denn?
Weiß jetzt nicht wie langsam/schnell Access ist aber ich hatte auch schon SQLs mit mehreren (5+) Subselects und wenn die Datenmengen nicht riesig waren und die Indices ordentlich gesetzt waren lief auch das schnell genug.
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#7

AW: SQL - Nach nicht direkt gegebenem Datum suchen

  Alt 7. Apr 2016, 20:14
Versuch mal:
Code:

select a.*
  from table2 a
  join (select ArtikelID, max(Datum) xdate
          from table2 ap
         where ap.Datum < '26.02.2016'
         group by ArtikelID) x
    on a.ArtikelID = x.ArtikelID
   and a.Datum = x.xdate
-- oder  

select a.*
  from table2 a,
       (select ArtikelID, max(Datum) xdate
          from table2 ap
         where ap.Datum < '26.02.2016'
         group by ArtikelID) x
 where a.ArtikelID = x.ArtikelID
   and a.Datum = x.xdate
Gibt wahrscheinlich 1 oder max 2 Fullscans, mehr sollten es nicht werden. Bei der Syntax weiß ich nicht, was Access da eher schluckt.
Gruß, Jo
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#8

AW: SQL - Nach nicht direkt gegebenem Datum suchen

  Alt 7. Apr 2016, 23:05
Ein klein wenig anders:
SQL-Code:
select a.Artikel, xpreis, xdate
from a join
(select id
       ,preis as xpreis
       ,max (datum) xdate
 from tab2
 where date<=grenzdatum -- hier das Datum einsetzen
 Group by id) x on (x.id=a.id)
Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector

Geändert von p80286 ( 7. Apr 2016 um 23:06 Uhr) Grund: blödsinn
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#9

AW: SQL - Nach nicht direkt gegebenem Datum suchen

  Alt 7. Apr 2016, 23:25
Ok, das Gleichheitszeichen meinetwegen. Aber bei dem Rest bleibe ich bei meiner Version.
Ich habe es so verstanden, dass für alle Artikel (in der Tabelle ist ein Artikel mehrfach enthalten) jeweils der ausgegeben werden soll, der am gewählten Tag gültig ist, also n aus m Datensätzen selektiert werden müssen.
Gruß, Jo
  Mit Zitat antworten Zitat
Benutzerbild von joachimd
joachimd

Registriert seit: 17. Feb 2005
Ort: Weitingen
679 Beiträge
 
Delphi 12 Athens
 
#10

AW: SQL - Nach nicht direkt gegebenem Datum suchen

  Alt 8. Apr 2016, 11:15
Wenn Du eine nach Datum aufsteigende eindeutige ID hättest, wäre es Standard
Du willst zunächst wissen, welche Datensätze in Frage kommen:
Code:
  select artikelid, max(datum) as datum
    from #preise
    where datum<='2010-01-01' -- your date here
    group by artikelid
Das Ergebnis wird in einem INNER JOIN mit der Ursprungs-Tabelle verknüpft
Code:
select p.* from #preise p
inner join
(
  select artikelid, max(datum) as datum
    from #preise
    where datum<='2010-01-01' -- your date here
    group by artikelid
) pl
on (p.artikelid=pl.artikelid) and (p.datum=pl.datum)
Hinweis: Dies ist in Advantage Database getestet - da es aber SQL Standard ist, sollte es sogar ACCESS können.
#preise ist eine temp-Tabelle zum Testen, wie folgt erzeugt:
Code:
create table #preise(
id autoinc,
artikelid integer,
datum date,
preis money
);
insert into #preise(artikelid,datum,preis) values(1,'2012-01-01',12);
insert into #preise(artikelid,datum,preis) values(1,'2011-01-01',11);
insert into #preise(artikelid,datum,preis) values(1,'2010-01-01',10);
insert into #preise(artikelid,datum,preis) values(1,'2009-01-01',9);

insert into #preise(artikelid,datum,preis) values(2,'2012-01-01',24);
insert into #preise(artikelid,datum,preis) values(2,'2011-01-01',23);
insert into #preise(artikelid,datum,preis) values(2,'2010-01-01',22);
insert into #preise(artikelid,datum,preis) values(2,'2009-01-01',21);
Joachim Dürr
Joachim Dürr Softwareengineering
http://www.jd-engineering.de
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:04 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz