Чтобы ответить на ваш комментарий «Итак, если я не помещу collect_Date в WHERE, куда я должен поместить его для чего-то подобного в будущем?», Я предлагаю Common Table Expressions. Функционально они эквивалентны определению производной таблицы в предложении FROM, но они перемещают ее «выше», так что это больше похоже на «до», и я думаю, что они значительно облегчают чтение. Чтобы преобразовать отличное решение GMB в использование CTE:
--Leading ; because CTEs require prvious command terminated explicitly
;WITH cteWithDates as ( --cteDates becomes a virtual temporary table
SELECT
cyc.* --Keep all the original columns of FT_GPM_NPM_CYCLES
, Collect_Month_Key AS Collect_Date --and add Collect_Date and Unique_Key
, CONVERT(varchar(8),Collect_Month_Key) + '-' + Location_ID AS Unique_Key
FROM FT_GPM_NPM_CYCLES AS cyc
) --you could add more CTEs with the following format,
--all become available at the end
--, cteMore as (SELECT ... FROM ...)
--the first line after the closing ) has access to all CTEs, but ONLY that line
SELECT Location_ID,
Collect_Date,
Calc_Gross_Totals,
Loc_Country,
Unique_Key
FROM
cteWithDates AS cyc --Use the CTE as you would your original table,
--but the added fields are now available EVERYWHERE in your query!
INNER JOIN LU_Location AS loc
ON cyc.Lu_Loc_Key = loc.LU_Loc_Key
INNER JOIN LU_Loc_Country AS cty
ON loc.LU_Loc_Country_Key = cty.LU_Loc_Country_Key
WHERE
Collect_Date > '20160101' --NOW you can use CollectDate!
ORDER BY
Location_ID,
Collect_Date --And here too
Обратите внимание, что это намного эффективнее, чем определение фактической временной таблицы с помощью #TableName, поскольку оптимизатор запросов может отбрасывать неиспользуемые записи из CTE, но он должен поместить их все в таблицу #tevent, что является огромной разницей в производительности, если ваш таблица большая, а соответствующее подмножество маленькое.