Although I think the approach is sound, it is bad practice to use a built-in function name as a variable identifier, i.e., naming a list 'list'. The code as written will work, but shadowing a built-in name could cause confusion further down in the script.
Another option for finding unique values is to use the set data type, which inherently doesn't allow duplicates.
#Create empty set
salesSet = set()
with arcpy.da.SearchCursor(table, ["Sales"]) as cursor:
for sale, in cursor:
#Add sales to set
salesSet.add(sale)
del sale, cursor
#Iterate through set
for sale in salesSet:
arcpy.MakeFeatureLayer_management(table, "tableView", "Sales = '" + sale + "'")
...
...
A slightly different tack is to let the database engine identify unique values either through a SQL prefix
with arcpy.da.SearchCursor(table, ["Sales"], sql_clause=('DISTINCT', None)) as cursor:
or SQL postfix.
with arcpy.da.SearchCursor(table, ["Sales"], sql_clause=(None, 'GROUP BY Sales')) as cursor:
Performance wise, I am not sure where each approach falls out, but I can't imagine the differences being noticeable. My personal preference is using DISTINCT in a SQL prefix, but I know that ArcGIS 10.1 had issues with SQL clauses in cursors, so using a set data type might work with more versions.