PDA

View Full Version : SQL



Seiten : [1] 2

woodstock99
05-04-20, 14:50
HAllo zusammen,

ich habe ein SQL Problem . Und zwar will ich von der folgenden Tabelle
folgende Felder

TABLENAME + Schlüssel , ANLAGEUSER + CreationDate + und Creation Time (MAX DATUM+ ZEIT) und Anlageuser as letzteraenderer und das letzte Änderungsdatum + Uhrzeit (MIN DATUM + Uhrzeit) Also MIN MAX Wert.

Das Problem ist das die Zeit und das Datum 2 Felder sind (Das muss auch so bleiben )

Bei Max Datum / Max Zeit nimmer er die falsche Uhrzeit .
Wenn ich nach den Feldern ART / TAbellenname / Schlüssel / Tabllenfeld groupiere bekomme ich zwar dann das richtige Max Datum + Uhrzeit aber der User fehlt .


<tbody>
ART
TableName
SCHLüssel
TABELLENFELD
ANLAGEUSER
CreationDate
CreationTime


ARTIKEL
TABELEXXY
815
KEY
USER1
20180111
114533


ARTIKEL
TABELEXXY
815
FELD1
USER2
20180307
52515


ARTIKEL
TABELEXXY
815
FELD2
USER2
20180307
52908


ARTIKEL
TABELEXXY
815
FELD3
USER2
20180319
102217


ARTIKEL
TABELEXXY
815
FELD4
USER2
20180403
94713


ARTIKEL
TABELEXXY
815
FELD5
USER2
20180403
94713


ARTIKEL
TABELEXXY
815
FELD6
USER2
20180403
94713


ARTIKEL
TABELEXXY
815
FELD7
USER2
20180403
94713


ARTIKEL
TABELEXXY
815
FELD8
USER2
20180906
90427


Kunde
TABAAAAA
66666
FELD9
USER2
20180910
20320


Kunde
TABELEXXY
33333
FELD10
USER2
20180917
44720


Kunde
TABELEXXY
55555
FELD11
USER2
20180917
35800


Kunde
TABELEXXY
66666
FELD13
USER2
20181205
12847


Kunde
TABELEXXY
66666
FELD13
USER2
20181206
12925


ARTIKEL
TABELEXXY
815
FELD14
USER2
20181206
12925


ARTIKEL
TABELEXXY
815
FELD15
USER2
20181207
33331


ARTIKEL
TABELEXXY
815
FELD3
USER2
20181207
33331


ARTIKEL
TABELEXXY
815
FELD17
USER3
20180122
20456


ARTIKEL
TABELEXXY
815
FELD18
USER3
20180122
20456


ARTIKEL
TABELEXXY
815
FELD19
USER3
20180122
20456


ARTIKEL
TABELEXXY
815
FELD20
USER3
20180122
21037


ARTIKEL
TABELEXXY
815
FELD21
USER3
20180122
21037


ARTIKEL
TABELEXXY
815
FELD22
USER2
20180215
104919


ARTIKEL
TABELEXXY
815
FELD23
USER2
20180215
104919


ARTIKEL
TABELEXXY
815
FELD24
USER2
20180220
92721


ARTIKEL
TABELEXXY
815
FELD25
USER2
20180220
92721


ARTIKEL
TABELEXXY
815
FELD3
USER2
20180220
110530


ARTIKEL
TABELEXXY
815
FELD27
USER2
20180221
82906


ARTIKEL
TABELEXXY
815
FELD28
USER2
20180221
21446


ARTIKEL
TABELEXXY
815
FELD29
USER2
20180307
43744


ARTIKEL
TABELEXXY
815
FELD30
USER2
20180307
45645


ARTIKEL
TABELEXXY
815
FELD3
USER2
20180307
50113


ARTIKEL
TABELEXXY
815
FELD32
USER2
20180307
51504

</tbody>

Fuerchau
05-04-20, 20:50
Wenn du V7R3 hast (ggf. 7.2 mit irgendeinem TR):
select .... last_value(CHAR(Datum) concat char(Zeit)) over (partition by TABLENAME , Schlüssel , ANLAGEUSER order by CHAR(Datum) concat char(Zeit) desc)
from ...

Ansonsten kannst du auch eine derived Table/CTE verwenden:

select TABLENAME , Schlüssel , ANLAGEUSER, max(andat)
from (
select TABLENAME , Schlüssel , ANLAGEUSER
,CHAR(Datum) concat char(Zeit) as andat
from mytable
) hugo
group by TABLENAME , Schlüssel , ANLAGEUSER

woodstock99
06-04-20, 07:34
Nein ich kann keine CTE's etc verwenden und ich brauche das Datum und die Zeit in 2 verschiedenen Feldern . Das macht ja das ganze so kompliziert .. Oder ich seh vor lauter Wald die Bäume nicht ..

ILEMax
06-04-20, 07:46
warum nicht max(datum*1000000+zeit)

BenderD
06-04-20, 09:01
du kannst die zwei Felder zu einem timestamp zusammenfassen (timestamp ( datumsfeld, zeitfeld) und dann danch gruppieren, oder was immer du willst. Auch die kleinste Zeit zum größten Datium geht, dann muss man die Zeit vom Datum abziehen (timestamp(datumsfeld) - hour(zeitfeld) hours
- minute(zeitfeld) minutes - second(zeitfeld) seconds) dann das maximum davon.

D*B

B.Hauser
06-04-20, 12:54
Mir ist zwar nicht klar warum Du weder Common Table Expressions, noch verschachtelte Sub-Selects verwenden kannst.
Wenn ich das richtig verstanden habe, willst Du zwar den Maximal bzw. den Minimal-Wert der zusammengefassten Datums- und Zeit-Werte, aber dennoch 2 Spalten ausgeben, ... und das ohne CTE.

Das Problem bei Max() und Min() ist, dass Du nur einen Wert angeben kannst, du aber dennoch 2 Spalten möchtest und das ohne CTE!

Dann musst Du beide Werte zusammenfassen, und dann den Maximal- bzw. den Minimal-Wert wieder auseinanderdröseln. Wirklich nicht schön, aber so sollte es gehen:

Select Guppierungskriterien,
Dec(Left( Max(Digits(CreationDate) concat Digits(CreationTime)), 8), 8, 0) MaxDate,
Dec(Right(Max(Digits(CreationDate) concat Digits(CreationTime)), 6), 6, 0) MaxTime,
Dec(Left( Min(Digits(CreationDate) concat Digits(CreationTime)), 8), 8, 0) MinDate,
Dec(Right(Min(Digits(CreationDate) concat Digits(CreationTime)), 6), 6, 0) MinTime,
from YourSchema.YourTable
Group By Gruppierungskriterien
Order BY ...;

Birgitta

Fuerchau
06-04-20, 13:13
Natürlich geht das auch ohne CTE mit Derived Table.

select TABLENAME , Schlüssel , ANLAGEUSER, substr(andat, 1, 10), substr(andat, 11, 8)
from (

select TABLENAME , Schlüssel , ANLAGEUSER, max(andat) as andat
from (
select TABLENAME , Schlüssel , ANLAGEUSER
,CHAR(Datum) concat char(Zeit) as andat
from mytable
) hugo
group by TABLENAME , Schlüssel , ANLAGEUSER

) hugo2

Wenn deine Felder vom Typ DATE und TIME sind und du die TIMESTAMP-Funktion nimmst wie oben beschrieben, kannst du die Werte auch wieder per Date(andat), Time(Andat) splitten.

Eine CTE ist nur eine andere Schreibweise.

BenderD
06-04-20, 13:34
... besser weil einfacher ist ohnehin eine View!!!

D*B

und PX (pleipt xund)

Fuerchau
06-04-20, 13:50
Jein.
CPYTOIMPF verlangt eine TABLE/PF.

BenderD
06-04-20, 14:14
Jein.
CPYTOIMPF verlangt eine TABLE/PF.

... von CPYTOIMPF habe ich in der Frage nix gesehen - und überdies geht das bei mir auch mit einer View.