Community month continues for #WOW2020, with this week’s challenge being set by Spencer Baucke.
This week the challenge focuses on 3 techniques for enhancing a tabular display
- Drill Down / Expand to show the breakdown by Year
- Custom Header to control sorting
- Page Control
I managed this challenge, but it wasn’t without help – I did my research using my friend, Google, and found tutorials to help, so this blog is briefer as you’ll need to read the blogs I reference too 🙂
Drill Down / Expand
There was a similar challenge last year which I blogged about here… or rather I referenced Rosario Guana’s excellent blog here.
The slight difference between this and the current challenge is that on expand/drill down, the Season is being shown in a separate column, rather than within the same one as above. The need for ‘data duplication’ which is referenced in Rosario’s blog isn’t required in this case. The key fields I used to resolve this part of the challenge are
pSelected Player ID
An integer parameter, defaulted to 0
pLevel
An integer parameter, defaulted to 2
Max Level
IIF([pLevel]=1,2,1)
If pLevel is 1 then we’ve already ‘drilled down’, so the max level on display is 2, otherwise we’ve yet to drill down, so the max level on display is 1.
DD Level
IIF([Max Level]=2 AND [Player Id]=[pSelected Player ID],2,1)
If we’ve already drilled down somewhere and you’re on the player we drilled down to, then the drill down level is 2, otherwise it’s 1.
Player ID Arrow
IF [pSelected Player ID] = [Player Id] AND [Max Level]= 2 THEN ‘▼’
ELSE ‘►’
END
If we’ve already drilled down somewhere and you’re on the player we drilled down to, then we want to display the down arrow. I use this site to get the geometric shapes required.
Season Display
IF [pSelected Player ID] = [Player Id] AND [Max Level]=2 THEN STR([Season])
ELSE ”
END
If we’ve already drilled down somewhere and you’re on the player we drilled down to, then we want to display the Season otherwise it needs to be blank.
Player ID Display
Player ID
This is just a duplicate field.
The fields are then arranged along with the measures as below
Player ID is hidden (it will used for the sort later). DD Level is added to the Detail shelf, so it can be referenced by the parameter actions.
NOTE – I had to ask as it wasn’t obvious to me, but the Carries measure is essentially the number of records or count of the table, so Avg YPC becomes SUM([Yards])/[Carries].
To complete the drill down, when added to the dashboard, the following parameter actions are required
Selected Player
passes the value from the Player ID field into the pSelected Player ID parameter
Set Level
Passes the DD Level field into the pLevel parameter
Custom Header to Control Sorting
I followed Tessellation’s blog post, Ultimate Guide to Tables : Headers pretty much verbatim to build the header sheet. Here’s just a few pointers below on how my solution matches with the blog.
For the Measure Rows field referenced, I used the Position field as a field in the data set that contained at least 3 values :
IF [Position] = ‘FB’ THEN -1
ELSEIF [Position] = ‘H’ THEN 0
ELSEIF [Position] = ‘P’ THEN 1
END
I created parameters
pHeader MeasureNames (which is the equivalent of MN Parameter referenced in the blog).
and pHeader Position which is the equivalent of the Category Parameter mentioned
The parameter actions were then set as
Header – Set Sort Measure
passes Measure Names to the pHeader MeasureNames parameter
and
Header – Set Sort Direction
passes the Position field into the pHeader Position parameter
When defining the other variables referenced in the blog, I had an issue with the Measure1 TF field; my version looks like
IF [pHeader MeasureNames ] = ‘Measure1’
AND [pHeader Position] = [Position]
THEN TRUE
ELSE FALSE
END
For the sorting, I created
Sort Measure Value
CASE [pHeader MeasureNames ]
WHEN ‘Measure1’ THEN [Carries]
WHEN ‘Measure2’ THEN SUM([Yards])
WHEN ‘Measure3’ THEN [Avg YPC]
WHEN ‘Measure4’ THEN SUM([TDs])
END
and then Sort
IF [pHeader Position] = ‘P’
//up arrow selected, sort ascending
THEN -1 * [Sort Measure Value]
ELSE [Sort Measure Value]
END
Note – I chose my up and down arrows to behave different from how they are described in the blog. To me clicking ‘up’ suggests a sort ‘upwards’ ie ascending from small to large.
The Sort field is then used to apply the sort to the Player ID field on the table
Page Control
Again I followed a blog by Tessellation – Ultimate Guide to Tables in Tableau : Pagination
The exception, was at Step 5 Build the page navigator, I simply created a new sheet called ‘Curr Page’. This referenced 2 calculated fields
Current Page No
[pPage No]
where pPage No is the equivalent of the page number parameter referenced in the blog.
Total Pages
FLOOR({COUNTD([Player Id])}/[pRows Per Page])+1
where pRows Per Page is the equivalent of the rows to show parameter referenced in the blog.
The only other slight addition required to this challenge, was to reset the page control to page 1 if the sorting was changed. This was done by creating a new calculated field
First Page No
1
adding this field to the Detail shelf on the header/sort controls sheet, then adding a parameter action
Reset to Page 1
which passes the First Page No to the pPage No parameter
Fingers crossed, I think I’ve covered the main points for this challenge and highlighted where the blogs might differ. My published viz is here.
This has given some great ideas of how to ‘pimp’ a table. I highly recommend you check out some of Tessellation’s other blog posts on tables :
- 26 ways to enhance tables in Tableau
- Ultimate Guide to Tables in Tableau – Part 3 Row Density
- Ultimate Guide to Tables in Tableau – Filtering
Happy Vizzin’! Stay Safe!
Donna
[…] of previous similar challenges, so built based on the techniques I’d applied before (see this blog). This involved a parameter to capture the ‘level’ and a ‘drill down’ […]
LikeLike