MS-Office-Forum

Zurück   MS-Office-Forum > Microsoft Access & Datenbanken > SQL
Registrieren Forum Hilfe Alle Foren als gelesen markieren

Banner und Co.

Antworten
Ads
Themen-Optionen Ansicht
Alt 04.02.2004, 22:32   #1
amahr78
MOF User
MOF User
Konfus SQL Abfragen verschachteln

Hallo, ich habe 3 Abfragen, die miteinander wie Tabellen verknüpft sind. Ich muss diese nun in eine große Abfrage zusammenfassen. Weiß jemand wie das geht?
Zur Zeit sieht das ganze so aus:


Abfrage1(Produktsummen):


SELECT [Artikel].[PG_ID] AS Produktgruppe, [Kundenanzahl].[Anzahl von K_ID] AS Kunden, Sum([Artikel].[Lizenz]*[Positionen].[Lizenzen]) AS Lizenzen, Sum([Positionen.GP]*[exchangevalue]) AS Produktsumme
FROM (((Positionen LEFT JOIN Waehrung ON [Positionen].[currencyID]=[Waehrung].[currencyID]) LEFT JOIN Artikel ON [Positionen].[Artikel]=[Artikel].[A_ID]) INNER JOIN Vertraege ON [Positionen].[W_ID]=[Vertraege].[W_ID]) LEFT JOIN Kundenanzahl ON [Artikel].[PG_ID]=[Kundenanzahl].[PG_ID]
WHERE ((([Vertraege].[Status])=1) And (([Vertraege].[Beginn])<=GetDate())) Or ((([Vertraege].[Status])=-1) And (([Vertraege].[Beginn])<=GetDate()) And (([Vertraege].[K_Datum])>GetDate())) Or ((([Vertraege].[Status])=2) And (([Vertraege].[Beginn])<=GetDate()) And (([Vertraege].[K_Datum])>GetDate()))
GROUP BY [Artikel].[PG_ID], [Kundenanzahl].[Anzahl von K_ID]
ORDER BY [Artikel].[PG_ID];




Abfrage2(Kundenanzahl):
SELECT [Kundenanzahl_a].[PG_ID], Count([Kundenanzahl_a].[K_ID]) AS [Anzahl von K_ID]
FROM Kundenanzahl_a
GROUP BY [Kundenanzahl_a].[PG_ID];




Abfrage3(Kundenanzahl_a):
SELECT Artikel.PG_ID, Vertraege.K_ID
FROM (Vertraege INNER JOIN Positionen ON Vertraege.W_ID = Positionen.W_ID) LEFT JOIN Artikel ON Positionen.Artikel = Artikel.A_ID
WHERE (((Vertraege.Status)=1) AND ((Vertraege.Beginn)<=GetDate())) OR (((Vertraege.Status)=-1) AND ((Vertraege.Beginn)<=GetDate()) AND ((Vertraege.K_Datum)>GetDate())) OR (((Vertraege.Status)=2) AND ((Vertraege.Beginn)<=GetDate()) AND ((Vertraege.K_Datum)>GetDate()))
GROUP BY Artikel.PG_ID, Vertraege.K_ID;


ich hab das ganze mal so versucht:

SELECT dbo.ARTIKEL.PG_ID AS Produktgruppe, SUM(dbo.ARTIKEL.Lizenz * dbo.POSITIONEN.Lizenzen) AS Lizenzen,
SUM(dbo.Positionen.GP * dbo.WAEHRUNG.exchangevalue) AS Produktsumme, ARTIKEL_1.PG_ID, COUNT(VERTRAEGE_1.K_ID) AS Kunden,
VERTRAEGE_1.K_ID
FROM dbo.POSITIONEN LEFT OUTER JOIN
dbo.WAEHRUNG ON dbo.POSITIONEN.currencyID = dbo.WAEHRUNG.currencyID LEFT OUTER JOIN
dbo.ARTIKEL ON dbo.POSITIONEN.Artikel = dbo.ARTIKEL.A_ID INNER JOIN
dbo.VERTRAEGE ON dbo.POSITIONEN.W_ID = dbo.VERTRAEGE.W_ID LEFT OUTER JOIN
dbo.ARTIKEL ARTIKEL_1 ON dbo.ARTIKEL.PG_ID = ARTIKEL_1.PG_ID RIGHT OUTER JOIN
dbo.VERTRAEGE VERTRAEGE_1 INNER JOIN
dbo.POSITIONEN POSITIONEN_1 ON VERTRAEGE_1.W_ID = POSITIONEN_1.W_ID ON ARTIKEL_1.A_ID = POSITIONEN_1.Artikel
WHERE (dbo.VERTRAEGE.Status = 1) AND (dbo.VERTRAEGE.Beginn <= GETDATE()) OR
(dbo.VERTRAEGE.Status = - 1) AND (dbo.VERTRAEGE.Beginn <= GETDATE()) AND (dbo.VERTRAEGE.K_Datum > GETDATE()) OR
(dbo.VERTRAEGE.Status = 2) AND (dbo.VERTRAEGE.Beginn <= GETDATE()) AND (dbo.VERTRAEGE.K_Datum > GETDATE())
GROUP BY dbo.ARTIKEL.PG_ID, ARTIKEL_1.PG_ID, VERTRAEGE_1.K_ID
HAVING (VERTRAEGE_1.Status = 1) AND (VERTRAEGE_1.K_Datum > GETDATE()) AND (VERTRAEGE_1.Beginn <= GETDATE()) OR
(VERTRAEGE_1.Status = - 1) AND (VERTRAEGE_1.Beginn <= GETDATE())
ORDER BY dbo.ARTIKEL.PG_ID


bekomme aber jetzt diese Fehlermeldung vom Abfragen erstellungs-Tool von MS-SQL-Server2000:

Server: Nachr.-Nr. 8121, Schweregrad 16, Status 1, Zeile 1
Die VERTRAEGE_1.Status-Spalte ist in der HAVING-Klausel ungültig, da sie nicht in einer Aggregatfunktion und nicht in der GROUP BY-Klausel enthalten ist.
Server: Nachr.-Nr. 8121, Schweregrad 16, Status 1, Zeile 1
Die VERTRAEGE_1.K_Datum-Spalte ist in der HAVING-Klausel ungültig, da sie nicht in einer Aggregatfunktion und nicht in der GROUP BY-Klausel enthalten ist.
Server: Nachr.-Nr. 8121, Schweregrad 16, Status 1, Zeile 1
Die VERTRAEGE_1.Beginn-Spalte ist in der HAVING-Klausel ungültig, da sie nicht in einer Aggregatfunktion und nicht in der GROUP BY-Klausel enthalten ist.
Server: Nachr.-Nr. 8121, Schweregrad 16, Status 1, Zeile 1
Die VERTRAEGE_1.Status-Spalte ist in der HAVING-Klausel ungültig, da sie nicht in einer Aggregatfunktion und nicht in der GROUP BY-Klausel enthalten ist.
Server: Nachr.-Nr. 8121, Schweregrad 16, Status 1, Zeile 1
Die VERTRAEGE_1.Beginn-Spalte ist in der HAVING-Klausel ungültig, da sie nicht in einer Aggregatfunktion und nicht in der GROUP BY-Klausel enthalten ist.


Kann mir bitte jemand auf die Sprünge helfen? Ich hab da totales Denk-Versagen und meine SQL-Kenntnisse sind sowieso schon lange am Ende
amahr78 ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 05.02.2004, 15:53   #2
Joachim Hofmann
MOF Koryphäe
MOF Koryphäe
Standard

So schrieb der Poster:
Hallo, ich habe 3 Abfragen, die miteinander wie Tabellen verknüpft sind.

Meinst Du vielleicht genauer: "Die ich verknüpfen möchte"? Weil: Wenn sie verknüpft sind, sind doch alle Abfragen zusammen?
So schrieb der Poster:
Ich muss diese nun in eine große Abfrage zusammenfassen.

Wiederum: Möchtest Du sie mit entsprechenden Feldern, die in jeweils zwei Tabellen vorhaden und gleichen Inhaltes sind (Kunden_Key o.ä. ect.) verknüpfen?
Oder möchtest Du eher alle Ergebniszeilen aller Abfragen untereinanderschreiben?

Falls Du ersteres vorhast würde ich immer:
- Feste Views V1..V3 aus dem Abfragencode machen,
- Den Enterprise Manager o.ä. aufmachen, V1..V3 einfügen und "Strippen ziehen" für die Verknüpfungen, die ich erzeugen will.
- Diese neue View ggf. wieder abspeichern.

__________________

Gruß edited with vim
Joachim
Joachim Hofmann ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 09.02.2004, 11:12   #3
amahr78
Threadstarter Threadstarter
MOF User
MOF User
Standard

ich versuchs mal so zu erklären,
die Abfragen werden benötigt um Datenbankberichte zu erstellen. Diese werden zur Zeit bei uns mit MS-Access erstellt. Da allerdings VS.net die Crystal Reports mitliefert und unsere MS-SQL-Server-Datenbank mittels eines C#-Progs bearbeitet wird, haben wir uns gedacht, das es da sinnvoller wäre von Access abstand zu nehmen und direkt in der VS.net umgebung mit Crystal Reports die Berichte zu erstellen.
Unter Access kann man in einer Abfrage auf Felder in einer anderen Abfrage zugreifen. Dies lässt CR.net scheinbar nicht zu. Ich bekomm da jedenfalls immer Fehlermeldungen, das die entsprechende Tabelle nicht existieren würde.
Nun benötige ich also eine SQL-Abfrage, die das selbe leistet wie vorher in Access die 3 Abfragen zusammen. Das scheint aber irgendwie nicht möglich zu sein

Ich hoffe, ich konnte mein Problem ein wenig verdeutlichen.
amahr78 ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 10.02.2004, 15:59   #4
amahr78
Threadstarter Threadstarter
MOF User
MOF User
Standard

ich habs geschafft. Man kann eine Tabelle, bzw. Abfrage Simulieren (ich nenns einfach mal so) indem man die Select-Anweisungen in die FROM Anweisung schreibt und einen Alias vergibt.
Jetzt kann im Haupt-SELECT auf die Felder der Unterabfrage wie auf normale Tabellenfelder zugegriffen werden.

SELECT [Artikel].[PG_ID] AS Produktgruppe, [Kundenanzahl].[Anzahl von K_ID] AS Kunden, Sum([Artikel].[Lizenz]*[Positionen].[Lizenzen]) AS Lizenzen, Sum(Positionen.GP*[exchangevalue]) AS Produktsumme

FROM (((Positionen LEFT JOIN Waehrung ON [Positionen].[currencyID]=[Waehrung].[currencyID]) LEFT JOIN Artikel ON [Positionen].[Artikel]=[Artikel].[A_ID]) INNER JOIN Vertraege ON [Positionen].[W_ID]=[Vertraege].[W_ID]) LEFT JOIN (SELECT [Kundenanzahl_a].[PG_ID], Count([Kundenanzahl_a].[K_ID]) AS [Anzahl von K_ID]
FROM (SELECT Artikel.PG_ID, Vertraege.K_ID
FROM (Vertraege INNER JOIN Positionen ON Vertraege.W_ID = Positionen.W_ID) LEFT JOIN Artikel ON Positionen.Artikel = Artikel.A_ID
WHERE (((Vertraege.Status)=1) AND ((Vertraege.Beginn)<=GetDate())) OR (((Vertraege.Status)=-1) AND ((Vertraege.Beginn)<=GetDate()) AND ((Vertraege.K_Datum)>GetDate())) OR (((Vertraege.Status)=2) AND ((Vertraege.Beginn)<=GetDate()) AND ((Vertraege.K_Datum)>GetDate()))
GROUP BY Artikel.PG_ID, Vertraege.K_ID
)Kundenanzahl_a
GROUP BY [Kundenanzahl_a].[PG_ID])Kundenanzahl ON [Artikel].[PG_ID]=[Kundenanzahl].[PG_ID]


WHERE ((([Vertraege].[Status])=1) And (([Vertraege].[Beginn])<=GetDate())) Or ((([Vertraege].[Status])=-1) And (([Vertraege].[Beginn])<=GetDate()) And (([Vertraege].[K_Datum])>GetDate())) Or ((([Vertraege].[Status])=2) And (([Vertraege].[Beginn])<=GetDate()) And (([Vertraege].[K_Datum])>GetDate()))
GROUP BY [Artikel].[PG_ID], [Kundenanzahl].[Anzahl von K_ID]
ORDER BY [Artikel].[PG_ID];


Ich habs leider nicht übersichtlicher hinbekommen, aber der Kursive Teil ist die Haupt-FROM-Anweisung in der eine Unterabfrage mit einer 2. Unterabfrage vorhanden ist. Ich hab also die (ganz) oben genannten 3 Abfragen zu einer zusammengefasst.
amahr78 ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 17.06.2009, 13:36   #5
casiri
(Email-Bestätigung fehlt!)
Standard 2 Abfragen mit LEFT JOIN verbinden

Hallo Andi habe folgendes Problem,

ich möchte 2 Abfragen mit JOIN LEFT verbinden bekomme das aber nicht.
Abfrage 1:
SELECT X300SD_TEIL.TETENR, X300SD_TEIL.TEBEZ1, X300SD_TEIL.TEBEZ2, X300SD_TEIL.TETEFA, X300SD_TEIL.TETART, X300SD_LGBS.LSLGBE, X300SD_LGBS.LSLANR
FROM X300SD_TEIL INNER JOIN X300SD_LGBS ON X300SD_TEIL.TETENR = X300SD_LGBS.LSTENR
GROUP BY X300SD_TEIL.TETENR, X300SD_TEIL.TEBEZ1, X300SD_TEIL.TEBEZ2, X300SD_TEIL.TETEFA, X300SD_TEIL.TETART, X300SD_LGBS.LSLGBE, X300SD_LGBS.LSLANR
HAVING (((X300SD_TEIL.TETEFA)="5025" Or (X300SD_TEIL.TETEFA)="6112") AND ((X300SD_TEIL.TETART)="2") AND ((X300SD_LGBS.LSLANR)="55" Or (X300SD_LGBS.LSLANR)="62"));
Abfrage 2:
SELECT X300SD_TEIL.TETENR, X300SD_TEIL.TEBEZ1, X300SD_TEIL.TEBEZ2, X300SD_TEIL.TETEFA, X300SD_TEIL.TETART, X300SD_LGBS.LSLGBE, X300SD_LGBS.LSLANR, Sum(X300SD_LGBW.LBMENG) AS SummevonLBMENG, X300SD_LGBW.LBBWSL, X300SD_LGBW.LBDATE
FROM (X300SD_TEIL INNER JOIN X300SD_LGBS ON X300SD_TEIL.TETENR = X300SD_LGBS.LSTENR) INNER JOIN X300SD_LGBW ON X300SD_TEIL.TETENR = X300SD_LGBW.LBTENR
GROUP BY X300SD_TEIL.TETENR, X300SD_TEIL.TEBEZ1, X300SD_TEIL.TEBEZ2, X300SD_TEIL.TETEFA, X300SD_TEIL.TETART, X300SD_LGBS.LSLGBE, X300SD_LGBS.LSLANR, X300SD_LGBW.LBBWSL, X300SD_LGBW.LBDATE
HAVING (((X300SD_TEIL.TETEFA)="5025" Or (X300SD_TEIL.TETEFA)="6112") AND ((X300SD_TEIL.TETART)="2") AND ((X300SD_LGBS.LSLANR)="55" Or (X300SD_LGBS.LSLANR)="62") AND ((X300SD_LGBW.LBBWSL)="02") AND ((X300SD_LGBW.LBDATE)=20090616));
Vielleicht kannst du mir helfen komme einfach nicht weiter.
Vielen Dank
Carsten
casiri ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Ads
Antworten


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Besucher: 1)
 
Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge anzufügen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

vB Code ist An.
Smileys sind An.
[IMG] Code ist An.
HTML-Code ist An.
Gehe zu


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:41 Uhr.


Partner und Co.
Access-Paradies -Alles rund um die Datenbank Microsoft Access -Code -Programme-Tools -Tipps   Kostenlose Tipps & Tricks, Downloads und Programme   www.kulpa-online.com - Tipps - Tricks - Tutorials - Meinungen - Downloads uvm...   vb@rchiv · Willkommen in der Welt der VB Programmierung   Access-Garhammer - Hier finden Sie jede Menge Beispiel-Datenbanken zu Access und mehr ...   mcseboard.de   Die Top Seite für Excel-VBA-Makros uvm.

Powered by: vBulletin Version 3.6.2 (Deutsch)
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.

Copyright ©2000-2018 MS-Office-Forum. Alle Rechte vorbehalten.
Copyright ©Design: Manuela Kulpa ©Rechte: Günter Kramer
Eine Verwendung der Inhalte in anderen Publikationen, auch auszugsweise,
ist ohne ausdrückliche Zustimmung der Autoren nicht gestattet.