stevensqwe
Goto Top

Wie kann ich zwei Zeilen einer Datenbank zu einer verschmelzen und unterschiedliche Spalten zusammenkombinieren?

Hey!
Bräuchte Eure Hilfe bzgl. eines Fusion-Problems, an dem ich gerade knabbere...
Schönen Gruß,
stevens

Zwei Zeilen einer Tabelle wie z.B.:

LotNumber TaskName StartDate StartTime EndDate EndTime
1000 A 1.1.2010 10:00 2.1.2010 21:00
1000 B 3.1.2010 19:00 5.1.2010 20:00


sollen folgend kombiniert werden:

LotNumber StartDate StartTime EndDate EndTime
1000 1.1.2010 10:00 5.1.2010 20:00

d.h. bei gleichen LotNumbers soll der kleinere StartDate und StartTime mit dem größeren EndDate und EndTime kombiniert werden, so dass wie im Beispiel bei LotNumber 1000 nun der StartDate und StartTime vom TaskName A verwendet wird und der EndDate und EndTime von TaskName B.

Wie könnte ich dies realisieren?

Content-Key: 140776

Url: https://administrator.de/contentid/140776

Printed on: April 19, 2024 at 14:04 o'clock

Member: dog
dog Apr 15, 2010 at 22:51:44 (UTC)
Goto Top
Eine Möglichkeit in MySQL (nicht die schnellste):
SELECT a.LotNumber,
(SELECT CONCAT(b.StartDate," ",b.StartTime) FROM test1 b WHERE b.LotNumber = a.LotNumber ORDER BY b.StartDate, b.StartTime LIMIT 1) AS `Start`,  
(SELECT CONCAT(c.EndDate," ",c.EndTime) FROM test1 c WHERE c.LotNumber = a.LotNumber ORDER BY c.EndDate DESC, c.EndTime DESC LIMIT 1) AS `End`  
 FROM test1 a GROUP BY a.LotNumber
Member: stevensqwe
stevensqwe Apr 16, 2010 at 16:22:02 (UTC)
Goto Top
Hi dog,
hab versucht, den MySQL Code in ACCESS SQL umzustricken, aber irgendwie streikt ACCESS (d.h. concat gegen & ausgetauscht (zuerst, dann mit + für eine Datums- und UhrzeitAddition) und limit 1 durch top 1), geht aber leider nicht... irgendeine Idee?

SELECT A.LotNumber,
(SELECT (B.StartDate + B.StartTime) FROM M_LotNumber_StartEnd AS B 
WHERE B.LotNumber = A.LotNumber 
ORDER BY B.StartDate, B.StartTime TOP 1) AS Start, 
(SELECT (C.EndDate + C.EndTime) FROM M_LotNumber_StartEnd AS C 
WHERE C.LotNumber = A.LotNumber 
ORDER BY C.EndDate DESC, C.EndTime DESC TOP 1) AS End
FROM M_LotNumber_StartEnd AS A 
GROUP BY A.LotNumber
Fehlermeldung: Syntaxfehler . in Abfrageausdruck '(SELECT (B.StartDate + B.StartTime) FROM M_LotNumber_StartEnd AS B WHERE B.LotNumber = A.LotNumber ORDER BY B.StartDate, B.StartTime TOP 1)'.


[Edit Biber] Das letzte Mal für heute: Code-Tags nachgetragen. [/Edit]
Member: Biber
Biber Apr 16, 2010 at 17:10:55 (UTC)
Goto Top
Moin stevensqwe,

Access kennt weder LIMIT noch TOP. (Soweit ich weiss)

Wenn du die beide "TOP 1"-Stellen löscht, solltest du zumindest einen Resultset auf den Schirm bekommen.

Und wenn ich das Gestrunkele Statement richtig inhaliere, meinst du doch mit diesem ORDER BY...TOP 1 soviel
wie weniger komplex formulierende Menschen mit einem MAX() ...oder MIN() der Start/Endezeitpunkte bekunden würden.

Warum sagst du das dem Access nicht?

Nachtrag: so zum Beispiel:
SELECT A.LotNumber,
(SELECT max(B.StartDate + B.StartTime) FROM M_LotNumber_StartEnd AS B 
WHERE B.LotNumber = A.LotNumber ) AS Start, 
(SELECT min(C.EndDate + C.EndTime) FROM  M_LotNumber_StartEnd AS C 
WHERE C.LotNumber = A.LotNumber 
) AS End
FROM M_LotNumber_StartEnd AS A 
GROUP BY A.LotNumber
Grüße
Biber
Member: stevensqwe
stevensqwe Apr 16, 2010 at 22:21:58 (UTC)
Goto Top
Tach Biber,

irgendwie ist ACCESS mit dem A.LotNumber irgendwo nicht ganz einverstanden und beklagt sich:

"Das angegebene Feld 'A:LotNumber' kann sich auf mehr als eine der Tabellen beziehen, ..."

Was kann man da noch anders machen?

Schönen Gruß,
stevens
Member: Biber
Biber Apr 17, 2010 at 13:39:11 (UTC)
Goto Top
Moin stevensqwe,

das weiss ich so auch nicht - ich sehe da keinen Syntax-Fehler.

Ist aber auch insofern erstmal egal, da sich eigentlich zwei Folgefragen ergeben..

1. Wenn du wirklich "nur" die drei Felder Lotnumber, Max(StartZeit) der LotNumber, Min(Endzeit) der Lotnumber brauchen würdest OHNE weitere Attribute...
Dann bräuchtest du auch nicht über drei (logische) Tabellen gehen, sondern nur über eine.

 SELECT LotNumber,
                   max(StartDate + StartTime) AS Start, 
                   min(EndDate + EndTime) AS End
          FROM M_LotNumber_StartEnd 
GROUP BY LotNumber

2. Wenn du aber mehr Attribute brauchst, dann müssen die ja entweder aus dem Datensatz mit der Max-Startzeit oder dem mit der Min-Endzeit kommen.
Also dann: welche Attribute woher, falls Variante 1 nicht ausreicht?

Grüße
Biber
Member: stevensqwe
stevensqwe Apr 17, 2010 at 16:32:18 (UTC)
Goto Top
Hi Biber,

die Lösung ist spitze! Ja, ich brauche noch eine weitere Einschränkung, aber die muss ich nicht mit auflisten, sondern kann sie mit einem WHERE abfackeln... Wir hatten oben noch vertauscht, dass die kleinste Anfangszeit und die größte Endzeit herausgefilter wird, aber dann ist es PERFEKT! Danke nochmal!!

SELECT LotNumber, min(StartDate + StartTime) AS Start, max(EndDate + EndTime) AS End
FROM M_LotNumber_StartEnd
WHERE LyoNr="RL-1"
GROUP BY LotNumber;
Member: Biber
Biber Apr 17, 2010 at 16:56:14 (UTC)
Goto Top
Moin stevensqwe,

freut mich, wenn es so passt.
Die beiden Zeitpunktwerte hatte ich zu flüchtig gelesen - ich war vom spätest möglichen Start- und dem frühest möglichen Endezeitpunkt ausgegangen.

Schönes Wochenende
Biber
Member: stevensqwe
stevensqwe Apr 17, 2010 at 17:31:20 (UTC)
Goto Top
Hi Biber,
noch ein kleiner Nachtrag: Die Benennung End hat den Parser dazu ermutigt, eckige Klammern drumzumachen und zwischenzeitlich ziemlich random einfach keine Ergebnisse zu liefern... Hab einfach End in EndZ umbenannt und jetzt läuft's stabil... Keine Ahnung, was das schon wieder seitens ACCESS war?! face-big-smile
Herzlichen Dank Dir und ein schönes Wochenende!!!
stevens
Member: Biber
Biber Apr 17, 2010 at 17:54:26 (UTC)
Goto Top
Moin stevensqwe,

die eckigen Klammern sind wieder verursacht durch die Verwendung eines "reservierten Wortes".
Ich habe gestern oder vorgestern in einen anderen Access-Beitrag einen Link auf die von M$ veröffenliche Liste gepostet, aber ich glaube, es steht auch sogar in den Access-Hilfedateien.

Das Umbenamsen von "End" in "EndZ" war auf jeden Fall die richtige Reaktion.

Grüße
Biber