2015-07-23 5 views
1

Я решил проблему, которую мне дали для работы - я просто решил ее использовать временные таблицы - и я предпочел бы ее решить, используя 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

+0

Это должно быть довольно просто сделать это, используя внешнее применять для извлечения счета для каждого из предыдущих 5 лет, но, по крайней мере, я не могу понять из вашего SQL, как знаете, к какому году принадлежит каждый из ордеров, или каждый год имеет разные значения PRODUCT_MAJOR? Создание некоторых выборочных данных предпочтительно SQL-скрипту поможет много. –

+0

Показаны некоторые примеры данных и то, что ожидаемый результат должен быть полезен. –

+0

Мне нужно немного поиграть, чтобы получить то, что я могу разместить здесь. Суть в том, что это две колонки. Год и идентификатор. Если идентификатор прошел в этом году, они находятся в данных. Затем я хочу запросить все годы и заметьте, сколько идентификаторов прошло последние 3 года 5 лет. – Scott04073

ответ

0

Это очень просто:

  1. В цепочке КТР включают в себя запрос, чтобы получить все годы: ,someyears as (select distinc [year] as cnt from ...).
  2. Учите использовать свою петлю, присоединитесь к этой таблице.

Пример:

SELECT cnt, Count(*) FROM (
    SELECT cnt 'Year', [ID], Count(*) 'Cnt' 
    FROM AttendeesOverS inner join someyears on 
    [Year] > (@cnt-5) AND [Year] <= @cnt 
    GROUP BY [ID] 
    HAVING Count(*) > 2) ... 
+0

Да - это то, что это делает ... С MeetingMatrix AS ( ВЫБРАТЬ Год (END_DATE) 'год', ВСТРЕЧА ИЗ MEET_MASTER ГДЕ MEETING_TYPE = 'CONV' И (Год (END_DATE)> 2000 и год (END_DATE) Scott04073

+0

Это значит, что работает для вас? – danihp

+0

Не пробовал - но я буду искать угол. – Scott04073

Смежные вопросы