Clever-Excel-Forum

Normale Version: SQL: virtuelles Kriterium in WHERE-Klausel
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Hallo Forum,

folgende Konstellation:
Mappe1!DS enthält Datensätze mit dieser Struktur: |Datum | Konto | Vorgang | Betrag|
Mappe2!BEZ hat diese Struktur: |Projektnummer | Projektbezeichnung|

Die Projektnummer in Mappe1 ergibt sich aus dem Vorgangstext.  
Der SQL-String: SELECT *, LEFT(Vorgang,4) AS Projektnummer FROM `C:\Mappe1.xlsx`.`DS`
generiert ein Tabellenblatt mit der Struktur: |Datum | Konto | Vorgang | Betrag | Projektnummer|

Leider gelingt es mir nicht. die Projektbezeichnung über die WHERE-Klausel einzubeziehen;
die virtuell erzeugte Projektnummer wird dort nicht akzeptiert.
SELECT *, LEFT(Vorgang,4) AS Projektnummer
 FROM `C:\Mappe1.xlsx`.`DS`, `C:\Mappe2.xlsx`.`BEZ`
 WHERE Projekt = `BEZ$`.Projektnummer

Hat jemand eine Idee, wie man das Problem mit einer (1) Abfrage lösen kann?
Den (funktionierenden) Work-Around mit 2 nacheinander geschalteten Abfragen würde ich mir gern ersparen. 

Mit freundlichen Grüßen
Rolf Beißner
Hallöchen,

erst mal eins - Du schreibst
Zitat:Mappe1!DS enthält Datensätze mit dieser Struktur: |Datum | Konto | Vorgang | Betrag|

dann schreibst Du
Zitat:Die Projektnummer in Mappe1 ergibt sich aus dem Vorgangstext.

Meintest Du eventuell im zweiten Zitat die Mappe 2?

1)
Eventuell zeigst Du mal Deinen funktionierenden Code aus dem Workaround , vielleicht auch gleich mit zwei Beispieldateien

2)
bei Zugriff auf mehrere Tabellen müsstest Du auch die Tabellen angeben, also im Prinzip so etwas wie
SELECT ds.Datum, ds.Konto, ds.Vorgang, ds.Betrag, LEFT(ds.Vorgang,4) AS Projektnummer_ds, bez.Projektbezeichnung, bez.Projektnummer
From ...
Where Projektnummer_ds = bez.Projektnummer
Hallo Schauan,

die Projektnummer ergibt sich aus dem Vorgangstext - LEFT (vorgang,4) - und existiert noch nicht als separates Kriterium bzw. Spalte in einer Mappe.
Genau das ist das Problem, für das ich eine Abfragelösung suche. Man kann das natürlich in zwei Stufen erledigen: Zuerst die Daten in einem
Tabellenblatt ausgeben, und sich dann in einer zweiten Abfrage auf dieses Blatt beziehen. Aber das will ich gern vermeiden.

Freundliche Grüße
Rolf
Hi,

der SQL String heißt nicht nur so, er ist auch ein String. Das heißt, er ist kein String, den man wild mit Funktionen oder Variablen durchsetzen kann, er muss entsprechend zusammengesetzt werden.

Bsp.:
Code:
Dim strSQL as string
strSQL = "SELECT *, " & LEFT(Vorgang,4) & " AS Projektnummer... "

oder:
Code:
Dim strSQL as string, strVorgang as string
strVorgang = Left(Vorgang,4)
strSQL = "SELECT *, " & strVorgang & " AS Projektnummer... "

Also, Strings in Anführungszeichen und diese mit Funktionen, Konstanten oder Variablen über & miteinander verbinden...

"Select a, " & strVorgang & " From..."

und immer schön auf die Leerzeichen achten....  70
Hi Ralf,


Der String passt schon (fast) wie angegeben zusammen.

Das z.B. ist falsch: ... "SELECT *, " & LEFT(Vorgang,4) & " AS Projektnummer... "
LEFT(Vorgang,4) hat nix mit VBA-"Berechnung" oder Variablen zu tun, das ist ein Teil der SQL-Anweisung.

(fast):
Lediglich "Projekt" hängt in der Luft, deswegen meine Änderung an zwei Stellen in Projektnummer_ds
Hallo,

kann das sein, dass du ein Join-Statement schreiben willst?
Code:
SELECT
   a.Datum, a.Konto, LEFT(a.Vorgang,4) as Projektnummer,
   b.Projektbezeichnung
FROM
   `C:\Mappe1.xlsx`.`DS` as a
LEFT JOIN
   `C:\Mappe2.xlsx`.`BEZ` as b
ON
   Projektnummer = b.Projektnummer

einfacher wahrscheinlich, die Textverarbeitung in den ON-Teil zu verfrachten:
Code:
SELECT
   a.Datum, a.Konto, b.Projektnummer,
   b.Projektbezeichnung
FROM
   `C:\Mappe1.xlsx`.`DS` as a
LEFT JOIN
   `C:\Mappe2.xlsx`.`BEZ` as b
ON
   LEFT(a.Vorgang,4) = b.Projektnummer
Gegebenenfalls musst du das Ergebnis von LEFT() noch in eine Zahl wandeln, damit gejoined werden kann.
Viele Grüße
derHöpp
Hallo Kollegen,

danke, dass Ihr euch mit meinem Problem beschäftigt habt.
Danke vor allem an deHöpp. Der JOIN-Ansatz ist die Lösung.

Herzliche Grüße
Rolf
(29.11.2022, 19:58)schauan schrieb: [ -> ]Das z.B. ist falsch: ... "SELECT *, " & LEFT(Vorgang,4) & " AS Projektnummer... "
LEFT(Vorgang,4) hat nix mit VBA-"Berechnung" oder Variablen zu tun, das ist ein Teil der SQL-Anweisung.

...davon bin ich ausgegangen... hatte Vorgang als VBA Variable betrachtet....