Hi Steve. I think the trick here is that you need your data to contain a list of every possible customer and item combination. You should be able to do that with a custom SQL using a cross-join. Something like this:
SELECT DISTINCT C.Customer, I.Item, S.[Transaction], S.Sales FROM tblSales I
INNER JOIN tblSales C on 1=1
LEFT OUTER JOIN tblSales S on C.Customer = S.Customer and I.Item = S.Item
The result will be that you'll get every possible combination of customer and item plus the actual sales that match those combinations. If a combination does not have an actual Sale then Transaction and Sales will be NULL. In Tableau, you can then filter based on these NULL values to determine which items a customer did not buy or vice versa. For example, here's your dashboard when I select "Beta Corp". You can see what hey bought of Cat Food and Toner, but can also see that they did not buy any Shirts.
Hope this helps. See attached workbook.
Sample Problem.twbx 15.1 KB
Cross Joins are a bit of a performance bummer (it's a very large data set), but this makes *total* sense. Thank you & see you at TC18!
Yep, agreed, it definitely won't be particularly performant.