Tableau has the ability to connect to SharePoint Online lists via a JDBC connector. Although setting up the data source is trivial, it can be challenging to join two related tables when that relation is done through multi-valued or multi-select fields. This is because the JDBC connector - unlike the Power Query connector used by Power BI and Microsoft Access - brings back multi-valued fields as XML code embedded inside a single column value. This article discusses an approach to solve the multi-valued field join problem in SharePoint JDBC using Custom SQL with UNION clauses.
<Group_x0020_MembershipId type=""Collection(Edm.Int32)""> <element>3</element> <element>2</element> </Group_x0020_MembershipId>
The SQL query is structured as follows: select primary table ID, extracted 1st element from multi-value field from primary table UNION select primary table ID, extracted 2nd element from multi-value field from primary table UNION select primary table ID, extracted 3rd element from multi-value field from primary table ... up to the 10th field, or more if needed.
select primary table ID, extracted 1st element from multi-value field from primary table UNION select primary table ID, extracted 2nd element from multi-value field from primary table
UNION select primary table ID, extracted 3rd element from multi-value field from primary table ... up to the 10th field, or more if needed.
XML_EXTRACT(table_alias.field_name, '/internal_field_name/element[n]')
SELECT "PeopleGroupMembershipLInk"."ID" AS "PeopleID (PeopleGroupMembershipLInk)", CAST( REPLACE(REPLACE( TRIM(XML_EXTRACT("PeopleGroupMembershipLInk"."GroupMembershipId", '/Group_x0020_MembershipId/element[1]')) , CHAR(13) , ''), CHAR(10), '') AS INTEGER) AS "GroupId (PeopleGroupMembershipLInk)" FROM "rest"."People" "PeopleGroupMembershipLInk" WHERE REPLACE(REPLACE( TRIM(XML_EXTRACT("PeopleGroupMembershipLInk"."GroupMembershipId", '/Group_x0020_MembershipId/element[1]')) , CHAR(13) , ''), CHAR(10), '') <> ''
UNION
SELECT "PeopleGroupMembershipLInk"."ID" AS "PeopleID (PeopleGroupMembershipLInk)", CAST( REPLACE(REPLACE( TRIM(XML_EXTRACT("PeopleGroupMembershipLInk"."GroupMembershipId", '/Group_x0020_MembershipId/element[2]')) , CHAR(13) , ''), CHAR(10), '') AS INTEGER) AS "GroupId (PeopleGroupMembershipLInk)" FROM "rest"."People" "PeopleGroupMembershipLInk" WHERE REPLACE(REPLACE( TRIM(XML_EXTRACT("PeopleGroupMembershipLInk"."GroupMembershipId", '/Group_x0020_MembershipId/element[2]')) , CHAR(13) , ''), CHAR(10), '') <> '' UNION ...
Gabriel Mongefranco is a Mobile Data Architect at the University of Michigan Eisenberg Family Depression Center. Gabriel has over a decade of experience in data analytics, dashboard design, automation, back end software development, database design, middleware and API architecture, and technical writing.
| |