Best practice om Budget en ReportingBalance te koppelen in Tableau?

Use case is Exact Online-data gebruiken, via een Invantive-applicatie die de data naar een eigen MySQL Azure database laadt of rechtstreeks met een Tableau Connector (OData) op de database van Exact Online op Invantive Cloud.

In het tweede geval, OData connector met Tableau, krijg ik de join tussen Financial_ReportingBalance en Budget_Budgets niet goed. De join is op:

on    [budgets].[division]        = [reportingbalance].[division]
and   [budgets].[glaccountcode]   = [reportingbalance].[glaccountcode]
and   [budgets].[reportingyear]   = [reportingbalance].[reportingyear]
and   [budgets].[reportingperiod] = [reportingbalance].[reportingperiod]

(CostCenter/Unit zijn leeg).

Ik gebruikte voorheen een Union, maar dat kan niet met OData in Tableau.

(Vraag afgesplitst van topic Best practice om Budget en ReportingBalance ververst te krijgen in Tableau?)

CostCenter leeg?

Het is niet geheel duidelijk of de getoonde join op MySQL (of mogelijk SQL Server?) of Invantive is. Het lukt ook niet goed om te achterhalen wat de rol van “CostCenter/Unit zijn leeg” is; dit komt niet terug in de join, en of het een inner join, left outer join, right outer join of full outer join is.

Mocht een oplossing gezocht worden voor lege CostCenter/CostUnit waardes die met elkaar moeten matchen als beiden ontbreken:

Onafhankelijk van de SQL-implementatie zal elke SQL-variant zich grotendeels aan de standaarden conformeren. Hierbij geldt dat een null (leeg) nergens mee overeenkomt, omdat het staat voor “onbekend”. Zelfs “onbekend” is niet gelijk aan “onbekend”; de betekenis van een lege cel kan zelfs meerdere soorten “onbekend” zijn zoals “er is geen waarde”, “de waarde is niet bekend” of “de waarde is wel bekend maar niet bij de gebruiker die het record ingevoerd heeft”.

De join zal bij lege velden terecht geen resultaat geven.

Enkele manieren om “onbekend” (null) gelijk te stellen aan “onbekend” zijn:

  • gebruik is operator i.p.v. = (alleen MySQL voor zover bekend).
  • gebruik een defaultwaarde zoals and coalesce(c1, 'niet-bestaande-waarde') = coalesce(c2, 'niet-bestaande-waarde')
  • schrijf de is-operator uit in SQL zoals and ( ( c1 is null and c2 is null ) or c1 = c2 )

In het algemeen is een full outer join aan te bevelen als de combinaties wel overlappen, maar mogelijk beiden waardes buiten de overlap kunnen hebben. Een left outer join of join zal anders delen van de gegevens laten verdwijnen. Het zal nodig om deze bij twee tabellen ook te controleren dat de natuurlijke sleutels gelijk zijn; anders is een group by nodig met een subquery zoals geillustreerd met de volgende query:

select *
from   ( select dim1, dim2, sum(val1) from t1 group by dim1, dim2 ) t1c
full
outer
join   ( select dim1, dim2, sum(val1) from t2 group by dim1, dim2 ) t2c
on     t1c.dim1 = t2c.dim1
...

Zonder tussendatabase: eigen view

Daarnaast is het altijd mogelijk om een eigen view te maken; die wordt dan via OData ook beschikbaar gemaakt. Een view op Invantive SQL kan ook een union bevatten. Zie verder:

Bedankt. Wat ik nog niet snap is waar ik de view aanmaak (in een startup SQL)? Is dat een nieuwe database, datacontainer of een applicatie?

Bij de database kan een view-definitie ingesteld worden in de startup SQL van een bestaande database. Alle statements uit de startup SQL worden bij het openen van de database uitgevoerd.

Zie ook:

Deze vraag is automatisch gesloten na 2 weken inactiviteit. Het laatste gegeven antwoord is gemarkeerd als oplossing.

Gelieve een nieuwe vraag te stellen via een apart topic als het probleem opnieuw optreedt. Gelieve in de nieuwe vraag een link naar dit topic op te nemen door de URL er van in de tekst te plakken.