Dieses Forum nutzt Cookies
Dieses Forum verwendet Cookies, um deine Login-Informationen zu speichern, wenn du registriert bist, und deinen letzten Besuch, wenn du es nicht bist. Cookies sind kleine Textdokumente, die auf deinem Computer gespeichert werden. Die von diesem Forum gesetzten Cookies werden nur auf dieser Website verwendet und stellen kein Sicherheitsrisiko dar. Cookies aus diesem Forum speichern auch die spezifischen Themen, die du gelesen hast und wann du zum letzten Mal gelesen hast. Bitte bestätige, ob du diese Cookies akzeptierst oder ablehnst.

Ein Cookie wird in deinem Browser unabhängig von der Wahl gespeichert, um zu verhindern, dass dir diese Frage erneut gestellt wird. Du kannst deine Cookie-Einstellungen jederzeit über den Link in der Fußzeile ändern.

SQL: virtuelles Kriterium in WHERE-Klausel
#1
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
Antworten Top
#2
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
.      \\\|///      Hoffe, geholfen zu haben.
       ( ô ô )      Grüße, André aus G in T  
  ooO-(_)-Ooo    (Excel 97-2019+365)
Antworten Top
#3
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
Antworten Top
#4
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
Der sicherste Ansatz für einen Irrtum ist der Glaube, alles im Griff zu haben.
Nur, weil ich den Recorder bedienen kann, macht mich das noch lange nicht zum Musiker.

Ciao, Ralf

Antworten Top
#5
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
.      \\\|///      Hoffe, geholfen zu haben.
       ( ô ô )      Grüße, André aus G in T  
  ooO-(_)-Ooo    (Excel 97-2019+365)
Antworten Top
#6
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
[-] Folgende(r) 1 Nutzer sagt Danke an derHoepp für diesen Beitrag:
  • Rolf Beißner
Antworten Top
#7
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
Antworten Top
#8
(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....
Der sicherste Ansatz für einen Irrtum ist der Glaube, alles im Griff zu haben.
Nur, weil ich den Recorder bedienen kann, macht mich das noch lange nicht zum Musiker.

Ciao, Ralf

Antworten Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste