PDA

View Full Version : Erstellen einer View



Seiten : [1] 2

Jenne
19-11-13, 14:08
Hallo Kollegen,

ich habe da ein Problem, vielleicht kann mir einer helfen. Ich möchte eine View aus 2 Tabellen erstellen soweit so gut.
Die View soll nur die Artikelnr, Filiale und die Summe(Menge) aus allen beiden Tabellen enthalten.

Leider habe ich in der Tabelle2 einige Datensätze dies es nicht in der Tabelle1 gibt, die dann aber trotzdem in der View enthalten sein sollen.

Auch wenn ich die beiden Tabellen verknüpfe, wird die Summe der Menge gleichen Artikelnr mehrfach summiert.

Wir haben V7R1 im Einsatz

Vielen Dank im Voraus
Jenne


Tabelle1





Artikelnr

Filiale

Menge



100

1

10



100

2

10



100

1

20



200

1

30



300

2

5







Tabelle2





Artikelnr

Filiale

Menge



100

1

10



100

1

10



200

2

20



400

3

30



500

1

5

B.Hauser
19-11-13, 14:20
Du meinst, Du willst beide Tabellen zusammenmischen?
Das SQL Statement müsste etwa so lauten


Create View Schema/View
as (Select ArtikelNr, Filiale, Sum(Menge) Menge
from ( Select ArtikelNr, Filiale, Menge
From Tabelle1
Union All
Select ArtikelNr, Filiale, Menge
From Tabelle2) x
Group By ArtikelNr, Filiale)

Jenne
19-11-13, 14:50
Hallo B.Hauser,

irgendwo habe ich einen Fehler denn ich aber nicht finde. Ich sende einmal mein Originalstatement:


CREATE VIEW art_reserv
(MANDANT_NR, FILIAL_NR, ZENTRAL_NR, MENGE)
AS (SELECT AUF_DEFA.MANDANT_NR, AUF_POS_ZW.FILIAL_NR,
AUF_POS_ZW.ZENTRAL_NR , SUM( AUF_POS_ZW.BESTELLMENGE -
AUF_POS_ZW.FEHLMENGE + auf_msv3.liefermenge )
from (select AUF_DEFA.MANDANT_NR, AUF_POS_ZW.FILIAL_NR,
AUF_POS_ZW.ZENTRAL_NR ,
AUF_POS_ZW.BESTELLMENGE , AUF_POS_ZW.FEHLMENGE
from auf_defa, AUF_POS_ZW,AUF_KO_ZW
WHERE AUF_DEFA.MANDANT_NR = AUF_KO_ZW.MANDANT_NR AND
AUF_DEFA.FILIAL_NR =
AUF_KO_ZW.FILIAL_NR AND AUF_DEFA.ARS_AUFTRAG_NR =
AUF_KO_ZW.ARS_AUFTRAG_NR AND AUF_DEFA.STATUS_KEZ = ' ' AND
AUF_DEFA.MANDANT_NR = AUF_POS_ZW.MANDANT_NR AND
AUF_DEFA.ARS_AUFTRAG_NR = AUF_POS_ZW.ARS_AUFTRAG_NR AND (
AUF_POS_ZW.BESTELLMENGE - AUF_POS_ZW.FEHLMENGE ) <> 0 AND
AUF_POS_ZW.SATZ_KEZ <> 'T'
union all Select auf_msv3.mandant_nr.
auf_msv3.filial_nr, Auf_msv3.zentral_nr, auf_msv3.liefermenge from
auf_msv3) x
GROUP BY AUF_DEFA.MANDANT_NR, AUF_POS_ZW.FILIAL_NR,
AUF_POS_ZW.ZENTRAL_NR)

Gruß
Jenne

B.Hauser
19-11-13, 15:56
Nach SELECT auf_msv3.mandant darf kein Punkt, sondern muss ein Komma folgen.

Warum muss alles in einer View sein?
Erstelle für die Verknüpfung jeweils eigene Views und packe diese schließlich in eine gemeinsame View.
Views können innerhalb von Views wie Tabellen oder physische Dateien verwendet werden.

Birgitta

Jenne
19-11-13, 16:10
Danke B. Hauser Du hast natürlich recht.

Jetzt kommt aber "Spaltenanzahl unterschiedlich. Das verstehe ich ja noch.
Weil ich AUF_POS_ZW.BESTELLMENGE , AUF_POS_ZW.FEHLMENGE eingegeben habe.
Wenn ich aber dafür
sum(AUF_POS_ZW.BESTELLMENGE - AUF_POS_ZW.FEHLMENGE)

eingebe, dann kommt:

"Spalte MANDANT_NR oder Ausdruck in SELECT-Liste nicht gültig."

Gruß
Jenne

B.Hauser
19-11-13, 16:51
Du hast den Sub-Select mit der Union-Anweisung auch x genannt.
Wenn Du Deine Spalten im endgültigen SELECT qualifizieren willst, musst Du auch x. verwenden und nicht irgendwas anderes. Um sicher zustellen, dass die Spalten den gleichen Namen haben solltest Du die Namen festlegen. Entweder nach x, z.B. x (Filiale, ArtikelNr, Menge)

Im endgültigen SELECT-Statement muss dann x.Filiale (oder einfach nur Filiale) etc. verwendet werden.

Birgitta

Jenne
20-11-13, 15:07
Hallo Britta,

im Endgültigen Select kommt aber nicht die Feherlmeldung:

"Spalte MANDANT_NR oder Ausdruck in SELECT-Liste nicht gültig."

sondern im Subselect :

CREATE VIEW art_reserv
(MANDANT_NR, FILIAL_NR, ZENTRAL_NR, MENGE)
AS (SELECT AUF_DEFA.MANDANT_NR, AUF_POS_ZW.FILIAL_NR,
AUF_POS_ZW.ZENTRAL_NR , SUM( AUF_POS_ZW.BESTELLMENGE -
AUF_POS_ZW.FEHLMENGE + auf_msv3.liefermenge )
from (select AUF_DEFA.MANDANT_NR, AUF_POS_ZW.FILIAL_NR,
AUF_POS_ZW.ZENTRAL_NR ,sum(
AUF_POS_ZW.BESTELLMENGE - AUF_POS_ZW.FEHLMENGE)
from auf_defa, AUF_POS_ZW,AUF_KO_ZW
WHERE AUF_DEFA.MANDANT_NR = AUF_KO_ZW.MANDANT_NR AND
AUF_DEFA.FILIAL_NR =
AUF_KO_ZW.FILIAL_NR AND AUF_DEFA.ARS_AUFTRAG_NR =
AUF_KO_ZW.ARS_AUFTRAG_NR AND AUF_DEFA.STATUS_KEZ = ' ' AND
AUF_DEFA.MANDANT_NR = AUF_POS_ZW.MANDANT_NR AND
AUF_DEFA.ARS_AUFTRAG_NR = AUF_POS_ZW.ARS_AUFTRAG_NR AND (
AUF_POS_ZW.BESTELLMENGE - AUF_POS_ZW.FEHLMENGE ) <> 0 AND
union all Select auf_msv3.mandant_nr,
auf_msv3.filial_nr, Auf_msv3.zentral_nr, auf_msv3.liefermenge from
auf_msv3)
x (MANDANT, FILIALE, PZN, MENGE)
GROUP BY auf_defa.MANDANT_NR, AUF_POS_ZW.FILIAL_NR,
AUF_POS_ZW.ZENTRAL_NR)

Ich weiß nicht wo der Fehler sitzt!!!!

Könntest Du mir das einmal farblich markieren?

Gruß
Jenne

Fuerchau
20-11-13, 15:39
Hallo Britta,

im Endgültigen Select kommt aber nicht die Feherlmeldung:

"Spalte MANDANT_NR oder Ausdruck in SELECT-Liste nicht gültig."

sondern im Subselect :

CREATE VIEW art_reserv
(MANDANT_NR, FILIAL_NR, ZENTRAL_NR, MENGE)
AS (SELECT AUF_DEFA.MANDANT_NR, AUF_POS_ZW.FILIAL_NR,
AUF_POS_ZW.ZENTRAL_NR , SUM( AUF_POS_ZW.BESTELLMENGE -
AUF_POS_ZW.FEHLMENGE + auf_msv3.liefermenge )
from (select AUF_DEFA.MANDANT_NR, AUF_POS_ZW.FILIAL_NR,
AUF_POS_ZW.ZENTRAL_NR ,sum(
AUF_POS_ZW.BESTELLMENGE - AUF_POS_ZW.FEHLMENGE)
from auf_defa, AUF_POS_ZW,AUF_KO_ZW
WHERE AUF_DEFA.MANDANT_NR = AUF_KO_ZW.MANDANT_NR AND
AUF_DEFA.FILIAL_NR =
AUF_KO_ZW.FILIAL_NR AND AUF_DEFA.ARS_AUFTRAG_NR =
AUF_KO_ZW.ARS_AUFTRAG_NR AND AUF_DEFA.STATUS_KEZ = ' ' AND
AUF_DEFA.MANDANT_NR = AUF_POS_ZW.MANDANT_NR AND
AUF_DEFA.ARS_AUFTRAG_NR = AUF_POS_ZW.ARS_AUFTRAG_NR AND (
AUF_POS_ZW.BESTELLMENGE - AUF_POS_ZW.FEHLMENGE ) <> 0 AND
union all Select auf_msv3.mandant_nr,
auf_msv3.filial_nr, Auf_msv3.zentral_nr, auf_msv3.liefermenge from
auf_msv3)
x (MANDANT, FILIALE, PZN, MENGE)
GROUP BY auf_defa.MANDANT_NR, AUF_POS_ZW.FILIAL_NR,
AUF_POS_ZW.ZENTRAL_NR)

Ich weiß nicht wo der Fehler sitzt!!!!

Könntest Du mir das einmal farblich markieren?

Gruß
Jenne

Das AND vor UNION ist zuviel.
Mit Union leitest du einen neuen Select ein.

Jenne
20-11-13, 16:11
Das AND vor UNION ist zuviel.
Mit Union leitest du einen neuen Select ein.

Sorry hatte die folgende Zeile nicht mit kopiert:
"AUF_POS_ZW.SATZ_KEZ <> 'T'"

jetzt ergibt auch das "and" einen Sinn.

Kannst Du jetzt bitte noch einmal schauen?

Gruß
Jenne

Fuerchau
20-11-13, 18:05
Bei der Umformatierung wird es deutlicher:

CREATE VIEW art_reserv
(
MANDANT_NR,
FILIAL_NR,
ZENTRAL_NR,
MENGE)

AS (

SELECT
AUF_DEFA.MANDANT_NR,
AUF_POS_ZW.FILIAL_NR,
AUF_POS_ZW.ZENTRAL_NR ,

SUM( AUF_POS_ZW.BESTELLMENGE - AUF_POS_ZW.FEHLMENGE + auf_msv3.liefermenge )

from (

select
AUF_DEFA.MANDANT_NR,
AUF_POS_ZW.FILIAL_NR,
AUF_POS_ZW.ZENTRAL_NR ,

-- Hier befindest du dich auf Einzelsatzebene daher ist "sum" zuviel!!!
sum( AUF_POS_ZW.BESTELLMENGE - AUF_POS_ZW.FEHLMENGE)

from auf_defa, AUF_POS_ZW, AUF_KO_ZW

WHERE
AUF_DEFA.MANDANT_NR = AUF_KO_ZW.MANDANT_NR
AND AUF_DEFA.FILIAL_NR = AUF_KO_ZW.FILIAL_NR
AND AUF_DEFA.ARS_AUFTRAG_NR = AUF_KO_ZW.ARS_AUFTRAG_NR
AND AUF_DEFA.STATUS_KEZ = ' '
AND AUF_DEFA.MANDANT_NR = AUF_POS_ZW.MANDANT_NR
AND AUF_DEFA.ARS_AUFTRAG_NR = AUF_POS_ZW.ARS_AUFTRAG_NR
AND (AUF_POS_ZW.BESTELLMENGE - AUF_POS_ZW.FEHLMENGE ) <> 0
AND AUF_POS_ZW.SATZ_KEZ <> 'T'

union all

Select

auf_msv3.mandant_nr,
auf_msv3.filial_nr,
Auf_msv3.zentral_nr,
auf_msv3.liefermenge
from auf_msv3

)
x (MANDANT, FILIALE, PZN, MENGE)
GROUP BY
auf_defa.MANDANT_NR,
AUF_POS_ZW.FILIAL_NR,
AUF_POS_ZW.ZENTRAL_NR
)