Я решил проблему, которую мне дали для работы - я просто решил ее использовать временные таблицы - и я предпочел бы ее решить, используя CTE, если это вообще возможно. Ваша помощь ценится.Использование SQL Server CTE для дублирования результатов запроса временной таблицы
Проблема заключается в определении посещаемости конвенций. Но, твист, определить, сколько участников пошли на конвенцию 3 из предыдущих 5 лет.
Это работает, код (немного долго - извините ...):
DECLARE @cnt INT = 2006;
CREATE table #MeetingMatrix (MEETING varchar(10), Year Int);
CREATE table #Attendees (Year Int, ID varchar(10));
CREATE table #RollUp (Year Int, Matches Int);
-- Create table of meetings
INSERT INTO #MeetingMatrix (MEETING, [Year])
SELECT MEETING, CAST(Year(END_DATE) AS Int) FROM MEET_MASTER
WHERE MEETING_TYPE='CONV'
AND (Year(END_DATE) > 2000 AND YEAR(END_DATE) < 2016);
-- Create table of EVERYONE who has gone over the years
INSERT INTO #Attendees ([Year], ID)
SELECT DISTINCT MM.Year, Orders.ST_ID
FROM Orders
INNER JOIN Order_Lines on (Orders.Order_Number = Order_Lines.Order_Number)
INNER JOIN Product ON (Order_Lines.Product_Code = Product.Product_Code)
INNER JOIN #MeetingMatrix MM ON PRODUCT_MAJOR=MM.MEETING
GROUP BY MM.Year, Orders.ST_ID;
-- Create yearly results desired
WHILE @cnt <= YEAR(GetDate())
BEGIN
INSERT INTO #RollUp ([Year], Matches)
SELECT @cnt, Count(*) FROM (
SELECT @cnt 'Year', [ID], Count(*) 'Cnt'
FROM #Attendees
WHERE [Year] > (@cnt-5) AND [Year] <= @cnt
GROUP BY [ID]
HAVING Count(*) > 2) AS R
SET @cnt = @cnt + 1;
END;
-- display year results
SELECT * FROM #RollUp
-- clean up
Теперь это то, что я должен начать делать то же самое с помощью КТР - я просто не знаю, как пройти через каждый возможный год, а затем определить результаты за предыдущие 5 лет (и считать ли индивидуальный участник пошел 3 или более из этих 5 лет):
WITH MeetingMatrix AS (
SELECT Year(END_DATE) 'Year', MEETING FROM MEET_MASTER
WHERE MEETING_TYPE='CONV'
AND (Year(END_DATE) > 2000 AND YEAR(END_DATE) < YEAR(GetDate()))
)
, AttendeesOverSpan AS (
SELECT DISTINCT Product.PRODUCT_MAJOR, MM.Year, Orders.ST_ID
FROM Orders
INNER JOIN Order_Lines on (Orders.Order_Number = Order_Lines.Order_Number)
INNER JOIN Product ON (Order_Lines.Product_Code = Product.Product_Code)
INNER JOIN MeetingMatrix MM ON PRODUCT_MAJOR=MEETING
WHERE Orders.Status Not Like 'C%'
AND Order_Lines.Quantity_Ordered > 0
AND Product.Category in ('RB', 'TK')
AND (Lower(Product.ATTRIBUTES) <> 'comp')
GROUP BY Product.PRODUCT_MAJOR, MM.Year, Orders.ST_ID)
--, RollUpAttendees AS (
--)
SELECT ST_ID, Count(*) 'Cnt'
FROM AttendeesOverSpan
WHERE [Year] > 2010 AND [Year] < 2016
GROUP BY ST_ID
HAVING Count(*) > 2
ORDER BY Cnt Desc
Может кто-нибудь дать мне подсказку, как действовать с путём CTE здесь?
Вся помощь приветствуется.
Скотт Tucson, AZ
Это должно быть довольно просто сделать это, используя внешнее применять для извлечения счета для каждого из предыдущих 5 лет, но, по крайней мере, я не могу понять из вашего SQL, как знаете, к какому году принадлежит каждый из ордеров, или каждый год имеет разные значения PRODUCT_MAJOR? Создание некоторых выборочных данных предпочтительно SQL-скрипту поможет много. –
Показаны некоторые примеры данных и то, что ожидаемый результат должен быть полезен. –
Мне нужно немного поиграть, чтобы получить то, что я могу разместить здесь. Суть в том, что это две колонки. Год и идентификатор. Если идентификатор прошел в этом году, они находятся в данных. Затем я хочу запросить все годы и заметьте, сколько идентификаторов прошло последние 3 года 5 лет. – Scott04073