If you don't mind using VBA then a 'light' way to do this is by dynamically generating the SQL query.
I use something similar to the below pretty extensively for generating ad-hoc dashboards which don't need anything as complex as QlikView or Crystal
Hidden sheet 'Variables' contains a table 'Table_SQL_SALES_EMPLOYEES'. This is populated by SQL to just return the minimum required for param selection. Something like
SELECT DISTINCT AccountDirector FROM InvoicedSales ORDER BY AccountDirector.
I then have a named range 'Sales_Employees' which his its Refers To as
=Table_SQL_SALES_EMPLOYEES[AccountDirector]. This is mapped to a combo box, which has the Input Range set to 'Sales_Employees'. This will send a number to a cell of your choice (E5 in my case) of the item in the list selected. To return the actual value as per original SQL extract you need to use
=OFFSET(Table_SQL_SALES_EMPLOYEES[[#Headers],[AccountDirector]],$E$5,0). This is named 'Slp'.
.: We now have a drop-down selection box of all possible account directors. There's also another one for the financial quarter, but same principle :.
When the selection is changed in the combo box, it calls a macro 'changeFilter()'
Dim wb As Workbook
Set wb = Excel.ActiveWorkbook
Dim ws As Worksheet
Set ws = Excel.ActiveWorkbook.Sheets("Lookups")
Dim conn As Excel.WorkbookConnection
Dim slp As Name
Set slp = wb.Names("Slp")
Dim qtr As Integer
qtr = wb.Names("qtr").RefersToRange.Value2
Dim query As String
' Adjusted Sales Consolidated
Set conn = wb.Connections("SQL_ADJUSTEDSALES_CONSOLIDATED")
query = "SELECT * FROM InvoicedSales WHERE AccountDirector=" & "'" & slp.RefersToRange.Value2 & "'"
conn.OLEDBConnection.CommandText = query
I basically pre-configure the tables / pivots by hooking them up to the database with hardcoded variables and select the options 'Refresh data when opening file' and 'Remove data from the external data range before saving the workbook' - this keeps the filesize tiny as nothing is actually saved.
The filter change then overwrites the hardcoded variable with a dynamically generated SQL query using the parameter selected and then refreshes the table.