aivilon
Goto Top

Access Tabellenblätter zusammenführen, inkl. Abhängigkeiten

Hallo liebe Schwarmwissen-Administratoren face-smile

Lange ists her, nun steh ich mir mal wieder gröber auf dem Schlauch...

Ich habe in Access folgende Tabellen, welche ich zusammenführe:
TRC-Report: generische Auswertung ab einem Telefonsystem. Hier habe ich die am Telefon zugewiesenen, sogenannten TRC.
Tickets: ist eine voraufbereitete Tabelle mit allen Tickets in einem bestimmten Service (gleicher Service wie die Telefone). Hier sind die TRC bereits einer Kategorie zugewiesen.
TRC Formular: Hier sage ich, welche Kategorie hinter einer TRC Nummer steht. Zudem in einer Spalte das Jahr, wo die Assoziierung gütig war (es kann also sein, dass die Nummer 160 im Jahr 2021 zur Kategorie Banane zugewiesen war, und im Jahr 2022 zu der Kategorie Äpfel)

Nun habe ich eine Union Abfrage. Grundsätzlich funktioniert diese. Jedoch hat es im Jahreswechsel eben genau die Doppelspurigkeiten im TRC Formular gegeben. Sprich, dass es eben TRC Nummern geben kann, die in beiden Jahren vorkamen, aber unterschiedliche Kategorien besitzen. Deshalb habe ich eben noch die Spalte mit dem Jahr hinzugefügt, in der ein TRC gültig war.

Im Prinzip müsste ich die Union Abfrage nun so umgestalten, dass diese die Werte in der Spalte Kategorie (eben abgeleitet von der Spalte TRC per Innerjoin) abhängig vom Erfassungsjahr auswählt. Sprich, ist das Erfassungsjahr 2022 dann ist TRC 160 = Äpfel, wenn 2021 dann ist TRC 160 = Bananen

Ich dachte mir, am einfachsten ist es, wenn ich pro Jahr einen Select in die Union Abfrage hinzufüge. Jedoch mache ich da etwas falsch, denn irgendwie will das nicht so wie ich will und ja face-smile
z.B. habe ich so eine Zeile, welche für das TRC Jahr 2021 gültig ist, einen TRC hat der aber auf die falsche Kategorie zugeweisen ist, und im Jahr 2022 getippt wurde. Eigentlich möchte ich, dass aufgrund des Jahres die TRC Jahr 2022 Kategorie gewählt wird. Ich raff nicht, wie ich das am gescheitesten umsetze. Im Prinzip müsste ich das ja zusätzlich noch vom Erfassungsdatum abhängig machen.


SELECT
  [TRC-Report].Pilot AS Service,
  Format("0", "General Number") AS IncID,  
  [TRC Formular].[TRC Jahr] AS 'TRC Jahr',  
  [TRC Formular].Typ AS Typ,
  Format([TRC-Report].Transaktionscode, "General Number") AS TRC,  
  [TRC Formular].Produkt AS Produkt,
  [TRC Formular].Kategorie AS Kategorie,
  [TRC-Report].[Zahl der Anrufe] AS Steuerzahl,
  Format([TRC-Report].[Von Zeitraum], "yyyy.mm.dd") AS Erfassungsdatum  
FROM
  [TRC Formular]
  INNER JOIN [TRC-Report] ON [TRC Formular].[TCNeu] = [TRC-Report].[Transaktionscode]
Where [TRC Formular].[TRC Jahr]='2021';  


UNION ALL SELECT
  [TRC-Report].Pilot AS Service,
  Format("0", "General Number") AS IncID,  
  [TRC Formular].[TRC Jahr] AS 'TRC Jahr',  
  [TRC Formular].Typ AS Typ,
  Format([TRC-Report].Transaktionscode, "General Number") AS TRC,  
  [TRC Formular].Produkt AS Produkt,
  [TRC Formular].Kategorie AS Kategorie,
  [TRC-Report].[Zahl der Anrufe] AS Steuerzahl,
  Format([TRC-Report].[Von Zeitraum], "yyyy.mm.dd") AS Erfassungsdatum  
FROM
  [TRC Formular]
  INNER JOIN [TRC-Report] ON [TRC Formular].[TCNeu] = [TRC-Report].[Transaktionscode]
Where [TRC Formular].[TRC Jahr]='2022';  


UNION ALL SELECT

  [Ky2Help Tickets].Service AS Service,
  Format([Ky2Help Tickets].IncID, "General Number") AS IncID,  
  Year([Ky2Help Tickets].Erfassungsdatum) As 'TRC Jahr',   
  [Ky2Help Tickets].Typ AS Typ,
  Format([Ky2Help Tickets].TRC, "General Number") AS TRC,  
  [Ky2Help Tickets].Produkt AS Produkt,
  [Ky2Help Tickets].Kategorie AS Kategorie,
  [Ky2Help Tickets].Steuerzahl AS Steuerzahl, 
  Format([Ky2Help Tickets].Erfassungsdatum, "yyyy.mm.dd") AS Erfassungsdatum  
FROM
  [Ky2Help Tickets];

Ich glaube ich bin verwirrt :o)

Grüsse

Content-ID: 2237548741

Url: https://administrator.de/contentid/2237548741

Ausgedruckt am: 18.11.2024 um 01:11 Uhr

ukulele-7
ukulele-7 21.03.2022 um 11:21:36 Uhr
Goto Top
Du musst einfach nur deine Join-Condition erweitern, wobei ich jetzt mit Access nicht so firm bin, etwa so:
INNER JOIN [TRC-Report] ON [TRC Formular].[TCNeu] = [TRC-Report].[Transaktionscode]
AND [TRC Formular].[TRC Jahr] = datepart(year,[TRC-Report].[Von Zeitraum])
datepart() ist MSSQL, könnte in Access 1:1 funktionieren. Kann dieser Zeitraum im Report über mehrere Jahre gehen?
aivilon
aivilon 21.03.2022 aktualisiert um 11:43:36 Uhr
Goto Top
Zitat von @ukulele-7:
datepart() ist MSSQL, könnte in Access 1:1 funktionieren. Kann dieser Zeitraum im Report über mehrere Jahre gehen?

Danke dir, werde ich gleich mal ausprobieren.
Nein, der Zeitraum ist "von Zeitraum" "bis Zeitraum", jedoch ist das jeweils nur ein Tag. Es steht also bei beiden Zellen dasselbe. Kommt vom Telefonsystem so face-smile Ist ein bisschen verwirrend:
Von Zeitraum Bis Zeitraum TRC Anzahl .....
19.01.22 19.01.22 106 2
20.01.22 20.01.22 106 5

Edit:
Das Jahr im Report ist in kurzform, sprich 22, nicht 2022.
ukulele-7
ukulele-7 21.03.2022 um 11:35:28 Uhr
Goto Top
Dann bekommst du damit aus jedem Datensatz in TRC-Report das entsprechende Jahr, sollte also funktionieren. Datepart() gibt es auch in Access: https://support.microsoft.com/de-de/office/datepart-funktion-26868a79-55 ...
aivilon
aivilon 21.03.2022 um 12:15:16 Uhr
Goto Top
Irgendwie bringe ich das so ned zum laufen face-confused
Aber warte mal, im Prinzip ist es ja dieselbe Prüfung wie
INNER JOIN [TRC-Report] ON [TRC Formular].[TCNeu] = [TRC-Report].[Transaktionscode]
**Where [TRC Formular].[TRC Jahr]='2022';**  

Oder versteh ich was falsch?

Nur das klappt nicht mit And, nur mit Where
Bei deiner Version oben erhalte ich die Parameter Abfrage für Jahr face-confused . Danach, dass der Ausdruck falsch eingegeben oder zu komplex sei.

Zu erwähnen vielleicht noch:
TRC Formular.TRC Jahr ist als Zahl formatiert
[TRC-Report].[Von Zeitraum] ist als Datum formatiert
Wenn ich nun datepart(year,[TRC-Report].[Von Zeitraum]) noch in ein Format packe: AND [TRC Formular].[TRC Jahr] = Format(datepart(year,[TRC-Report].[Von Zeitraum]), "General Number");
erhalte ich einen Datentypkonflikt.
Lasse ich das Format weg, also: AND [TRC Formular].[TRC Jahr] = datepart(year,[TRC-Report].[Von Zeitraum]);
kommt wiederum die Parameterabfrage (also eine Inputbox welche nach dem Wert für Jahr Fragt)

Gott bin ich grad verwirrt
ukulele-7
ukulele-7 21.03.2022 aktualisiert um 12:29:46 Uhr
Goto Top
Hast du den WHERE-Teil auch raus genommen? Also ich dachte an sowas als komplettes Statement, ohne WHERE:
SELECT *
FROM
  [TRC Formular]
INNER JOIN [TRC-Report] ON [TRC Formular].[TCNeu] = [TRC-Report].[Transaktionscode]
AND [TRC Formular].[TRC Jahr] = datepart(year,[TRC-Report].[Von Zeitraum])
Und nein, das ist nicht das Gleiche wie [TRC Formular].[TRC Jahr]='2022'. Dabei werden zwar nur Datensätze aus TRC Formular geholt die in 2022 liegen aber darauf werden per Join ALLE Datensätze aus TRC Report geholt, solange nur der Transaktionscode stimmt. Also auch die Bananen aus deinem Beispiel die zu 2021 gehören.
aivilon
aivilon 21.03.2022 um 12:36:00 Uhr
Goto Top
Zitat von @ukulele-7:

Hast du den WHERE-Teil auch raus genommen? Also ich dachte an sowas als komplettes Statement, ohne WHERE:

Ja, der ist weg face-smile
FROM
  [TRC Formular]
  INNER JOIN [TRC-Report] ON [TRC Formular].[TCNeu] = [TRC-Report].[Transaktionscode]
      AND [TRC Formular].[TRC Jahr] = datepart(year,[TRC-Report].[Von Zeitraum]);

So erhalte ich dann die Parameter Abfrage Input Box face-sad
ukulele-7
ukulele-7 21.03.2022 um 12:43:23 Uhr
Goto Top
Zitat von @aivilon:

FROM
  [TRC Formular]
  INNER JOIN [TRC-Report] ON [TRC Formular].[TCNeu] = [TRC-Report].[Transaktionscode]
      AND [TRC Formular].[TRC Jahr] = datepart(year,[TRC-Report].[Von Zeitraum]);

So erhalte ich dann die Parameter Abfrage Input Box face-sad
Access scheint als Parameterabfrage eine Klammer mit Text zu verwenden, die ist hier nirgends gegeben. Die muss irgendwo anders her kommen, hast du den Select-Teil durch * ersetzt?

Du kannst das auch anders schreiben aber das erklärt nicht warum da eine Parameterabfrage kommt:
SELECT * FROM
  [TRC Formular]
  INNER JOIN [TRC-Report] ON [TRC Formular].[TCNeu] = [TRC-Report].[Transaktionscode]
WHERE [TRC Formular].[TRC Jahr] = datepart(year,[TRC-Report].[Von Zeitraum]);
aivilon
aivilon 21.03.2022 um 13:45:34 Uhr
Goto Top
Habs herausgefunden. Musste zum analysieren kurz eine Abfrage neu machen und ohne Union um den Fehler zu isolieren.
Access hadert wohl, trotz bestehendem Syntax, mit dem datepart. Mit Datepart(year.... kommt die parameterabfrage für das jahr, ohne datepart nicht. Respektive Access hat noch einen vereinfachten Syntax: year(xxxx)

SELECT

  [TRC-Report].Pilot AS Service,
  Format("0", "General Number") AS IncID,  
  [TRC Formular].[TRC Jahr] AS TRCJahr,
  [TRC Formular].Typ AS Typ,
  Format([TRC-Report].Transaktionscode, "General Number") AS TRC,  
  [TRC Formular].Produkt AS Produkt,
  [TRC Formular].Kategorie AS Kategorie,
  [TRC-Report].[Zahl der Anrufe] AS Steuerzahl,
  Format([TRC-Report].[Von Zeitraum], "yyyy.mm.dd") AS Erfassungsdatum  
FROM
  [TRC Formular]
  INNER JOIN [TRC-Report] ON [TRC Formular].[TCNeu] = [TRC-Report].[Transaktionscode]
      WHERE [TRC Formular].[TRC Jahr] = year([TRC-Report].[Von Zeitraum]);



UNION ALL SELECT

  [Ky2Help Tickets].Service AS Service,
  Format([Ky2Help Tickets].IncID, "General Number") AS IncID,  
  year([Ky2Help Tickets].Erfassungsdatum) As TRCJahr, 
  [Ky2Help Tickets].Typ AS Typ,
  Format([Ky2Help Tickets].TRC, "General Number") AS TRC,  
  [Ky2Help Tickets].Produkt AS Produkt,
  [Ky2Help Tickets].Kategorie AS Kategorie,
  [Ky2Help Tickets].Steuerzahl AS Steuerzahl, 
  Format([Ky2Help Tickets].Erfassungsdatum, "yyyy.mm.dd") AS Erfassungsdatum  
FROM
  [Ky2Help Tickets];


Die Magie war wirklich nur das "where" und "and"... mit deinem Input konnte ich aber von Jährlichen neuen Abfragen in der Union Abfrage auf zwei für alle Jahre runter gehen!

Danke dir!
ukulele-7
ukulele-7 21.03.2022 um 14:37:44 Uhr
Goto Top
Ohne das Datenmodell komplett sauber neu aufzusetzen wird es auch bei 2 Abfragen bleiben (denke ich, hab jetzt Teile nur überflogen), aber das sollte auch kein echtes Problem mehr darstellen da hier keine Jahreszahlen hart kodiert oder irgendwelche Eingaben erforderlich sind. Unterabfragen "pro Jahr" wären ganz großer Schmuh in einer DB.

Bitte als gelöst markieren falls damit erledigt.