Anmelden

View Full Version : Sql Abfrage



Seiten : 1 [2] 3

tarkusch
31-07-12, 12:45
Hallo,

ich wollte es eigentlich ohne DS erledigen.
Unser DatFormat schaut so aus: 20120731 (num. 8 0).

Gruß

RobertMack
31-07-12, 13:21
<unschön>
MOVEL JAHR4N DAT8N
MOVE '0101' DAT8N
</unschön>

DAT8N = (JAHR4N*10000)+101;

Fuerchau
31-07-12, 15:26
ILE:
%int(Datum/10000) * 10000 + 0101;

SQL:
floor(Datum / 10000) * 10000 + 0101

tarkusch
01-08-12, 07:00
Danke für eure Antworten und Hilfen.

Gruß
Tarki

tarkusch
02-08-12, 07:15
Hallo Herr Fuerchau,

ich habe eine Datei, wo Abteilungen mit Datum, und Preisen hinterlegt sind.

Wie erhalte ich eigentlich im Sql, nur einen Satz, der gerade aktuell ist, ohne das ich die anderen lesen müssen?

Gruß

Tarki

B.Hauser
02-08-12, 07:40
Hast Du neben dem Datum und dem Preis auch noch andere Informationen z.B. Artikel-Nr. in der Datei?

Sofern Du nur den Preis mit dem höchsten Datum willst, kannst Du diesen wie folgt ermitteln:


Select Datum, Preis
From Datei
Order By Datum Desc
Fetch First Row Only

Sofern Du zusätzlich z.B. auch noch die Artikel-Nr. hast und den Preis nur für einen bestimmten Artikel willst, kannst Du die gleiche Abfrage nehmen und fügst eine WHERE-Bedingung ein, mit der nur der entsprechende Artikel ausgewählt wird.

Sofern Du den jeweils den aktuellen Preis von allen Artikeln willst wird die Sache etwas komplexer, d.h. Du brauchst entweder ein verschachteltes (Sub-)Select oder eine Common Table Expression, durch die zunächst das letzte Datum pro Artikel ermittelt wird. Das Ergebnis verknüpfst Du dann mit der eigentlichen Tabelle/Datei.

Birgitta

tarkusch
02-08-12, 07:52
Danke Frau Hauser,

Goldrichtiges Statement.

Gruß

Tarki

Fuerchau
02-08-12, 09:29
Empfehlenswert ist in diesem Fall auch ein Index mit "Datum desc".

B.Hauser
02-08-12, 09:57
Empfehlenswert ist in diesem Fall auch ein Index mit "Datum desc".

Zugriffsweg mit Datum reicht (zumindest wenn die Abfrage von der SQE ausgeführt wird). SQL verarbeitet auf- und absteigend.

Birgitta

tarkusch
07-08-12, 21:34
Sofern man die Feldlänge nicht verändern möchte, d.h. nur ein 8-stelliges numerisches Feld mit 8-Zeichen incl. den führenden Nullen anzeigen möchste, ist die Funktion DIGITS eleganter:


Select Digits(NumFld) concat Digits(NextNum) concat X ...


Anstatt der double pipe (||) würde ich empfehlen immer CONCAT anzugeben. Die double pipe wird nicht in allen Umgebungen unterstützt, d.h. manchmal muss man stattdessen ein doppeltes Ausrufezeichen (!!) angeben.

Birgitta

Hallo Brigitta,

mein Problem mit dem Sql-Problem besteht noch immer.

ich habe mal die num. Werte gecatet(FINR_ART_LFD).

Aber besteht die Möglichkeit das ich mehrere Felder(FILEA.W1FINR, FILEA.W1ART#, FILEA.W1LFD#,
FILEB.W1FNR, FILEA.W2TX1, FILEA.W2TX2,
FILEB.W1TX1, FILEB.W1TX2) in ein Distinct zusammenfassen kann, sodass mir keine doppelten Sätze angezeigt werden?

Mein SqlStatement:
SELECT
Digits(FILEA.W1FINR) CONCAT Digits(FILEA.W1ART#) CONCAT
Digits(FILEA.W1LFD#) as FINR_ART_LFD,
FILEB.W1FNR, FILEA.W2TX1, FILEA.W2TX2,
FILEB.W1TX1, FILEB.W1TX2, MIN(FILEB.W1STMP), count(*)

FROM FILEA, FILEB
WHERE
FILEA.W1FINR = FILEB.W1GNR AND FILEA.W1ART# = FILEB.W1TNR
AND FILEA.W1LFD# = FILEB.W1ZNR AND FILEB.W1STMP > 20120101

Group by
FILEA.W1FINR, FILEA.W1ART#, FILEA.W1LFD#,
FILEB.W1FNR, FILEA.W2TX1, FILEA.W2TX2,
FILEB.W1TX1, FILEB.W1TX2, FILEB.W1STMP

Order by
FILEA.W1FINR, FILEA.W1ART#, FILEA.W1LFD#,
FILEB.W1FNR, FILEA.W2TX1, FILEA.W2TX2,
FILEB.W1TX1, FILEB.W1TX2, FILEB.W1STMP


Dank im Voraus und Gruß

TARKI