-
SQL update
Hallo zusammen,
vereinfachtes Bsp.
3 Dateien
select case when a.f1='J' then sum(a.f2) else sum(b.f2) end
from a left outer join b on a.f3=b.f3
left outer join c on c.f4=a.f4
group by c.f4
geht nicht, da a.f1 nicht im group ist
Schade, würde er erst den select bilden und dann groupen würde es gehen.
also so:
with xx as (select c.F4, case when a.f1='J' then sum(a.f2) else sum(b.f2) end as sme
from a left outer join b on a.f3=b.f3
left outer join c on c.f4=a.f4
group by a.f1, c.f4)
select f4, sum(sme) from xx group by f4
nun ist das Problem aber, das davor ein
Update d set f5 =( ... muß.
und das nicht geht.
Wie krig ich den Update hin ohne eine echteTemp Datei zu schreiben
In Worten
in abh. eines Kennzeichens aus Datei A brauch ich die Summe eines Feldes von Datei A oder Datei B, gegroupt auf einer Info aus Datei C um damit Datei D zu aktualisieren.
Danke
Robi
Das Notwendige steht über dem technisch machbaren.
(klingt komisch, funktioniert aber!)
-
1.
select sum(case when a.f1='J' then a.f2 else b.f2 end)
from a left outer join b on a.f3=b.f3
left outer join c on c.f4=a.f4
Ggf. ist dieser Sum einfacher, da du a je Satz entscheiden muss.
Da du nun keinen Schlüssel hast, kannst du auch keinen Group By machen.
2.
With ist im skalaren Subselect nicht erlaubt.
Aber ggf. erledigt sich das ja auch durch den obigen Select.
Dies wäre dann vielleicht so:
update a
set a.f5 = coalesce((select sum bla von oben.....), a.f5)
where bla
Zu bedenken ist noch, dass der skalare Select ja noch eine Beziehung zum Updatesatz herstellen sollte da sonst jeder das selbe bekommt, also
set x.f5 = coalesce((select sum bla von oben..... where x.key = a.key), x.f5)
where bla
-
Hallo und danke,
Leider geht das nicht, ich habe einen Fehler in MEINEM Bsp oben.
Ich brauche den Group.
so ist das Bsp nötig
Code:
select c.f4, case when a.f1='J' then sum(a.f2) else sum(b.f2) end
from a left outer join b on a.f3=b.f3
left outer join c on c.f3=a.f3
group by c.f4
Ergebnis
C.F4 Wert
1 1000
5 953
20 52771
...
noch ne Idee?
mache (für den Update) z.zt 2 Läufe, einen auf a einen auf b
oh, in deiner Version geht der Group, klappt also!! Danke
Last edited by Robi; 02-04-19 at 08:25.
Grund: es geht doch
Das Notwendige steht über dem technisch machbaren.
(klingt komisch, funktioniert aber!)
-
Ggf. brauchst du den Group ja doch nicht?
set x.f5 = coalesce((select sum bla von oben..... where x.f4 = a.f4), x.f5)
where bla
-
nein, das Prob. ist, a.F4 gibt es nicht.
Das Notwendige steht über dem technisch machbaren.
(klingt komisch, funktioniert aber!)
-
... der Group by summiert (oder whatever) ein ResultSet und liefert ein ResultSet. Für den update mit subselect brauchst Du genau einen Satz, mit anderen Worten: die group by Felder wandern in die where clause des subselects und die group by clause fällt weg, da jetzt ja über alle summiert wird.
D*B
-
Da hörst du Dieter.
Ich hätte es einfacher gesagt: Ein skalarer Subselect darf nur 1 Feld und 1 Satz als Ergebnis liefern.
Group by macht da keinen Sinn, da du dann nur die Gruppe liefern könntest und da gibts schnellere Wege.
Aber es muss doch eine Beziehung des Group-By-Feldes zur Update-Datei geben?
Oder schränkst du den Update noch zusätzlich ein?
Was und wie klappt denn nun das, was du vorhast?
-
So habe ich es nun gemacht
Code:
update DATEI_D set d_wert =COALESCE((
SELECT SUM(CASE WHEN a.f1='J' then b.f2 else a.f2 end)
FROM Datei_A a LEFT OUTER JOIN Datei_b b ON
a.k1 = b.k1 and a.k2 = b.k2 and ...
LEFT OUTER JOIN Datei_c c ON
a.k1 = c.k1 and ...
WHERE a.Fx = 1 and a.Fy = 0 AND a.Fz = 0 and c.F4 = D.F4
and a.Fxx = 2019 AND d.Fx= 201901
GROUP BY c.F4 ), 0)
WHERE d.fx= 201901 AND d.fy =201901
Das Notwendige steht über dem technisch machbaren.
(klingt komisch, funktioniert aber!)
-
Das kann dann nur funktionieren, wenn c.F4 nur genau 1 Wert enthält und dann kannst du hier den Group by auch ebenso weglassen.
Oder wie verlinkst (joinst) du da nun von Datei_D auf die Daten des Subselects, so dass nur 1 Wert für c.F4 vorkommt?
-
a oder b wird summiert
a und b sind miteinander und mit c verknüpft
a:c = n:1
b:c = n:1
a:b = 1:n
d hat n Sätze mit c.f4 was aber durch die anderen Bedingungen zu einem 1:1 wird.
Ob ich den Group weglassen kann?
müsste ich mal versuchen, so finde ich es auf jeden Fall lesbarer
Danke
Robi
Das Notwendige steht über dem technisch machbaren.
(klingt komisch, funktioniert aber!)
Similar Threads
-
By andreaspr@aon.at in forum IBM i Hauptforum
Antworten: 6
Letzter Beitrag: 01-12-15, 10:28
-
By co_steffl in forum IBM i Hauptforum
Antworten: 12
Letzter Beitrag: 25-06-14, 14:17
-
By Joe in forum IBM i Hauptforum
Antworten: 4
Letzter Beitrag: 15-04-03, 15:06
-
By Joe in forum IBM i Hauptforum
Antworten: 2
Letzter Beitrag: 01-04-03, 19:50
-
By schreibr in forum IBM i Hauptforum
Antworten: 4
Letzter Beitrag: 12-09-01, 08:22
Berechtigungen
- Neue Themen erstellen: Nein
- Themen beantworten: Nein
- You may not post attachments
- You may not edit your posts
-
Foren-Regeln
|
Erweiterte Foren Suche
Google Foren Suche
Forum & Artikel Update eMail
AS/400 / IBM i
Server Expert Gruppen
Unternehmens IT
|
Kategorien online Artikel
- Big Data, Analytics, BI, MIS
- Cloud, Social Media, Devices
- DMS, Archivierung, Druck
- ERP + Add-ons, Business Software
- Hochverfügbarkeit
- Human Resources, Personal
- IBM Announcements
- IT-Karikaturen
- Leitartikel
- Load`n`go
- Messen, Veranstaltungen
- NEWSolutions Dossiers
- Programmierung
- Security
- Software Development + Change Mgmt.
- Solutions & Provider
- Speicher – Storage
- Strategische Berichte
- Systemmanagement
- Tools, Hot-Tips
Auf dem Laufenden bleiben
|
Bookmarks