Do not input private or sensitive data. View Qlik Privacy & Cookie Policy.
Skip to main content

Announcements
Qlik Open Lakehouse is Now Generally Available! Discover the key highlights and partner resources here.
cancel
Showing results for 
Search instead for 
Did you mean: 
Alihan_02
Contributor III
Contributor III

Fact Tables Not Connected Properly / Synthetic Keys in Link Table

[EventsForCalendar_temp]:  // <--- NEUER Tabellenname hier
LOAD 
    subject, 
    start_dateTime, 
    start_timeZone as [EventsForCalendar.start_timeZone], 
    end_dateTime as [EventsForCalendar.end_dateTime], 
    end_timeZone as [EventsForCalendar.end_timeZone], 
    eventId as [EventsForCalendar.eventId], 
    attendees as [EventsForCalendar.attendees], 
    SubField(attendees, ',') AS 'Teilnehmer',
    Lower(SubField(attendees, ',')) AS Key,
    location_displayName as [EventsForCalendar.location_displayName], 
    importance as [EventsForCalendar.importance], 
    body_preview as [EventsForCalendar.body_preview], 
    recurrence as [EventsForCalendar.recurrence], 
    categories as [EventsForCalendar.categories], 
    hasAttachments as [EventsForCalendar.hasAttachments], 
    webLink as [EventsForCalendar.webLink], 
    body_contentType as [EventsForCalendar.body_contentType], 
    body_content as [EventsForCalendar.body_content],
    ConvertToLocalTime([start_dateTime], 'CET', false()) as Local_start_dateTime,
  Date(Floor(ConvertToLocalTime([start_dateTime], 'CET', false())), 'YYYY-MM-DD') AS Startdatum,
    If(Floor(ConvertToLocalTime([start_dateTime], 'CET', false())) < Today(), 1, 0) AS IsBeforeCutoff,
    Time(ConvertToLocalTime([start_dateTime], 'CET', false()), 'hh:mm') AS Startzeit, 
    ConvertToLocalTime([end_dateTime], 'CET', false()) as Local_end_dateTime,
    Date(Floor(ConvertToLocalTime([end_dateTime], 'CET', false())), 'YYYY-MM-DD') AS Enddatum,  
    Time(ConvertToLocalTime([end_dateTime], 'CET', false()), 'hh:mm') AS Endzeit,
	WeekDay(ConvertToLocalTime([start_dateTime], 'CET', false())) AS Debug_WeekDay2,

If([end_dateTime] >= Today(), Dual('Anstehende Termine', 1), Dual('Vergangene Termine', 0)) AS Termine,  // Flag für anstehende Termine

 Trim(SubField(subject, '/', 1)) AS Kunde, 
    Trim(SubField(subject, '/', 2)) AS Ort, 
    Trim(SubField(subject, '/', 3)) AS Kategorie, 
    Trim(SubField(subject, '/', 4)) AS Produktgruppe, 
    // Hier wird das '#' entfernt
    Trim(Replace(SubField(subject, '/', 5), '#', '')) AS Kundennummer,
    // Gleiches auch mit _Key_Kunde da ich kundennummer nicht zugreifen kann, qlik verarbeitet alles in dem moment 
    '1_' 
      & Trim(SubField(subject, '/', 4)) 
      & '_' 
      & Trim(Replace(SubField(subject, '/', 5), '#', '')) 
    AS _Key_Kunde,
    Trim(SubField(subject, '/', 6)) AS Terminart,
    Trim(SubField(subject, '/', 7)) AS Kollektionsquartal,
    Trim(Replace(SubField(subject, '/', 5), '#', '')) & '_' &  Trim(SubField(subject, '/', 4)) AS %Key_Field,
    
    ApplyMap('KategorieMapping', Lower(Trim( Trim(SubField(subject, '/', 3)))), Upper(Trim( Trim(SubField(subject, '/', 3))))) as KategorieStandard
    


WHERE WildMatch(Trim(SubField(subject, '/', 6)), 'S1', 'RT', 'OT')
;  // nach Terminart wenn Struktur vielleicht geändert wird dann auf 6 setzen 


SELECT subject,
	start_dateTime,
	start_timeZone,
	end_dateTime,
	end_timeZone,
	eventId,
	attendees,
	location_displayName,
	importance,
	body_preview,
	recurrence,
	categories,
	hasAttachments,
	webLink,
	body_contentType,
	body_content
FROM EventsForCalendar
WITH PROPERTIES (
WITH PROPERTIES (
calendarID='REDACTED',
maxResults=''
);



LIB CONNECT TO 'MyDatabaseConnection';


[int_ausap]:
LOAD 
    Datum_Anfangstermin, 
    Datum_Auftragseingang, 
    Datum_Storno,  
    Saison,
    Trim(Storno) as Storno,
    Anzahl_Bestellt,
    Anzahl_Fakturiert, 
    Kundennummer as Kundennummer,
    Produktgruppe as Produktgruppe,
    Kundennummer & '_' & Produktgruppe as %Key_Field 
;
// Storno Feld ergänzen, Neue Mapping 
SQL SELECT
    Datum_Anfangstermin,
    Datum_Auftragseingang,
    Datum_Storno,
    Saison,
    Storno,
    SUM(Anzahl_Bestellt)   AS Anzahl_Bestellt,
    SUM(Anzahl_Fakturiert) AS Anzahl_Fakturiert,
    Produktgruppe,
    Kundennummer
FROM my_database.PROD.int_ausap

WHERE CAST(SUBSTR(Saison, 3) AS INT64) >= (EXTRACT(YEAR FROM CURRENT_DATE()) - 2000 - 1)
GROUP BY
    _Key_Kunde,
    Datum_Anfangstermin,
    Datum_Auftragseingang,
    Datum_Storno,
    Saison,
    Storno,
     Kundennummer,
     Produktgruppe
;











[EventsForCalendar]:
Load 
	*,
    If (Produktgruppe = 'alle', 
    ApplyMap('PgMapping', Upper(Trim(KategorieStandard)), (Trim(Produktgruppe))) ,
   Produktgruppe)
    as Produktgruppe_alle

Resident EventsForCalendar_temp;









LinkTable:
Load Distinct
[%Key_Field],
SubField(%Key_Field, '_', 1) AS Kundennummer,  // Extrahiert Kundennummer
    SubField(%Key_Field, '_', 2) AS Original_Produktgruppe,  // Nimmt den ursprünglichen Produktgruppenwert
    SubField(SubField(%Key_Field, '_', 2), ' ') AS Produktgruppe  // Trennt Mehrfachwerte (z.B. "91 92")

Resident EventsForCalendar_temp;
//1 




Concatenate(LinkTable)
Load Distinct 
[%Key_Field],
SubField(%Key_Field, '_', 1) AS Kundennummer,  // Extrahiert Kundennummer
    SubField(%Key_Field, '_', 2) AS Original_Produktgruppe,  // Nimmt den ursprünglichen Produktgruppenwert
    SubField(SubField(%Key_Field, '_', 2), ' ') AS Produktgruppe  // Trennt Mehrfachwerte (z.B. "91 92")  // Trennt Mehrfachwerte,
Resident int_ausap;

















 
 // Falls [EventsForCalendar] diese Felder enthält, kannst du sie entfernen:
Drop Fields %Key_Field From [EventsForCalendar];
Drop Fields %Key_Field From [int_ausap];
//Drop Fields Kundennummer, Produktgruppe From [EventsForCalendar];
//Drop Fields Kundennummer, Produktgruppe From [int_ausap];

Drop Table EventsForCalendar_temp;
[EventsForCalendar_temp]:  // <--- NEUER Tabellenname hier
LOAD 
    subject, 
    start_dateTime, 
    start_timeZone as [EventsForCalendar.start_timeZone], 
    end_dateTime as [EventsForCalendar.end_dateTime], 
    end_timeZone as [EventsForCalendar.end_timeZone], 
    eventId as [EventsForCalendar.eventId], 
    attendees as [EventsForCalendar.attendees], 
    SubField(attendees, ',') AS 'Teilnehmer',
    Lower(SubField(attendees, ',')) AS Key,
    location_displayName as [EventsForCalendar.location_displayName], 
    importance as [EventsForCalendar.importance], 
    body_preview as [EventsForCalendar.body_preview], 
    recurrence as [EventsForCalendar.recurrence], 
    categories as [EventsForCalendar.categories], 
    hasAttachments as [EventsForCalendar.hasAttachments], 
    webLink as [EventsForCalendar.webLink], 
    body_contentType as [EventsForCalendar.body_contentType], 
    body_content as [EventsForCalendar.body_content],
    ConvertToLocalTime([start_dateTime], 'CET', false()) as Local_start_dateTime,
  Date(Floor(ConvertToLocalTime([start_dateTime], 'CET', false())), 'YYYY-MM-DD') AS Startdatum,
    If(Floor(ConvertToLocalTime([start_dateTime], 'CET', false())) < Today(), 1, 0) AS IsBeforeCutoff,
    Time(ConvertToLocalTime([start_dateTime], 'CET', false()), 'hh:mm') AS Startzeit, 
    ConvertToLocalTime([end_dateTime], 'CET', false()) as Local_end_dateTime,
    Date(Floor(ConvertToLocalTime([end_dateTime], 'CET', false())), 'YYYY-MM-DD') AS Enddatum,  
    Time(ConvertToLocalTime([end_dateTime], 'CET', false()), 'hh:mm') AS Endzeit,
	WeekDay(ConvertToLocalTime([start_dateTime], 'CET', false())) AS Debug_WeekDay2,

If([end_dateTime] >= Today(), Dual('Anstehende Termine', 1), Dual('Vergangene Termine', 0)) AS Termine,  // Flag für anstehende Termine

 Trim(SubField(subject, '/', 1)) AS Kunde, 
    Trim(SubField(subject, '/', 2)) AS Ort, 
    Trim(SubField(subject, '/', 3)) AS Kategorie, 
    Trim(SubField(subject, '/', 4)) AS Produktgruppe, 
    // Hier wird das '#' entfernt
    Trim(Replace(SubField(subject, '/', 5), '#', '')) AS Kundennummer,
    // Gleiches auch mit _Key_Kunde da ich kundennummer nicht zugreifen kann, qlik verarbeitet alles in dem moment 
    '1_' 
      & Trim(SubField(subject, '/', 4)) 
      & '_' 
      & Trim(Replace(SubField(subject, '/', 5), '#', '')) 
    AS _Key_Kunde,
    Trim(SubField(subject, '/', 6)) AS Terminart,
    Trim(SubField(subject, '/', 7)) AS Kollektionsquartal,
    Trim(Replace(SubField(subject, '/', 5), '#', '')) & '_' &  Trim(SubField(subject, '/', 4)) AS %Key_Field,
    
    ApplyMap('KategorieMapping', Lower(Trim( Trim(SubField(subject, '/', 3)))), Upper(Trim( Trim(SubField(subject, '/', 3))))) as KategorieStandard
    


WHERE WildMatch(Trim(SubField(subject, '/', 6)), 'S1', 'RT', 'OT')
;  // nach Terminart wenn Struktur vielleicht geändert wird dann auf 6 setzen 


SELECT subject,
	start_dateTime,
	start_timeZone,
	end_dateTime,
	end_timeZone,
	eventId,
	attendees,
	location_displayName,
	importance,
	body_preview,
	recurrence,
	categories,
	hasAttachments,
	webLink,
	body_contentType,
	body_content
FROM EventsForCalendar
WITH PROPERTIES (
calendarID='AQMkADU2ZDljNDViLTJhYjAtNGJkOC04NDU5LTk1OGQzNzY4MjBkYQBGAAADA23JPdsBQEAAsbIr7L7t_ogHAKyLFHDtxs1Ctg-VodHUFiEAAAIBBgAAAMR6ZdMNzCtCueM7xFilhgcAAAIkUAAAAA==',
maxResults=''
);


LIB CONNECT TO 'Developer Space:Google_BigQuery_brax-dwh-377910';

[int_ausap]:
LOAD 
    Datum_Anfangstermin, 
    Datum_Auftragseingang, 
    Datum_Storno,  
    Saison,
    Trim(Storno) as Storno,
    Anzahl_Bestellt,
    Anzahl_Fakturiert, 
    Kundennummer as Kundennummer,
    Produktgruppe as Produktgruppe,
    Kundennummer & '_' & Produktgruppe as %Key_Field 
;
// Storno Feld ergänzen, Neue Mapping 
SQL SELECT
    Datum_Anfangstermin,
    Datum_Auftragseingang,
    Datum_Storno,
    Saison,
    Storno,
    SUM(Anzahl_Bestellt)   AS Anzahl_Bestellt,
    SUM(Anzahl_Fakturiert) AS Anzahl_Fakturiert,
    Produktgruppe,
    Kundennummer
FROM brax-dwh-377910.PROD.int_ausap
WHERE CAST(SUBSTR(Saison, 3) AS INT64) >= (EXTRACT(YEAR FROM CURRENT_DATE()) - 2000 - 1)
GROUP BY
    _Key_Kunde,
    Datum_Anfangstermin,
    Datum_Auftragseingang,
    Datum_Storno,
    Saison,
    Storno,
     Kundennummer,
     Produktgruppe
;











[EventsForCalendar]:
Load 
	*,
    If (Produktgruppe = 'alle', 
    ApplyMap('PgMapping', Upper(Trim(KategorieStandard)), (Trim(Produktgruppe))) ,
   Produktgruppe)
    as Produktgruppe_alle

Resident EventsForCalendar_temp;









LinkTable:
Load Distinct
[%Key_Field],
SubField(%Key_Field, '_', 1) AS Kundennummer,  // Extrahiert Kundennummer
    SubField(%Key_Field, '_', 2) AS Original_Produktgruppe,  // Nimmt den ursprünglichen Produktgruppenwert
    SubField(SubField(%Key_Field, '_', 2), ' ') AS Produktgruppe  // Trennt Mehrfachwerte (z.B. "91 92")

Resident EventsForCalendar_temp;
//1 




Concatenate(LinkTable)
Load Distinct 
[%Key_Field],
SubField(%Key_Field, '_', 1) AS Kundennummer,  // Extrahiert Kundennummer
    SubField(%Key_Field, '_', 2) AS Original_Produktgruppe,  // Nimmt den ursprünglichen Produktgruppenwert
    SubField(SubField(%Key_Field, '_', 2), ' ') AS Produktgruppe  // Trennt Mehrfachwerte (z.B. "91 92")  // Trennt Mehrfachwerte,
Resident int_ausap;

















 
 // Falls [EventsForCalendar] diese Felder enthält, kannst du sie entfernen:
Drop Fields %Key_Field From [EventsForCalendar];
Drop Fields %Key_Field From [int_ausap];
Drop Fields Kundennummer, Produktgruppe From [EventsForCalendar];
Drop Fields Kundennummer, Produktgruppe From [int_ausap];

Drop Table EventsForCalendar_temp;
 

 

I am working on a data model in Qlik Sense where I have two fact tables (EventsForCalendar and int_ausap) and want to connect them through a Link Table.

🔎 Goal:

  • Create a Link Table using %Key_Field (which is a combination of Kundennummer and Produktgruppe).
  • Ensure that if a Produktgruppe has multiple values, they are split into separate rows.
  • Avoid synthetic keys.

🚨 Issue:

  • If I rename Kundennummer and Produktgruppe in the fact tables, I get synthetic keys.
  • If I drop them from the fact tables, the tables are not properly connected via the Link Table.

 

 

Labels (2)
1 Reply
SRA
Partner - Creator
Partner - Creator

Hi,

It seems the 2 fact tables have the same key. I would :
- keep a key in each fact table with a different name
- create the link table with the 2 keys + Kundennummer and Producktgruppe.
- remove form fact tables the fields Kundennummer and Producktgruppe. 

Model could look like :

SRA_0-1739284439068.png

It could help to add a %FactType in the link table (useful when you will create your measures in the app)

I hope it will help.
Regards,