2015-08-04 3 views
1

прохожу год значение входного параметра (@Year) моего прокПрисоединяйтесь существующую таблицу Temp Таблица

SELECT @Year [Year] 
    , t.Name AS [Town] 
    , COUNT(r.Id) AS [PropertyCount] 
    , CASE 
     WHEN @Year - [Age] < 11 THEN '1-10' 
     WHEN @Year - [Age] BETWEEN 11 AND 20 THEN '11-20' 
     ELSE 'Unknown' 
    END AS [AgeRange] 
    FROM Properties r 
    JOIN Towns t 
     ON t.Id = r.TownId 
    WHERE t.Id = @TownId 
    GROUP BY 
     t.Name, 
    CASE 
     WHEN @Year - [Age] < 11 THEN '1-10' 
     WHEN @Year - [Age] BETWEEN 11 AND 20 THEN '11-20' 
     ELSE 'Unknown' 
    END 

Я хочу, чтобы получить набор результатов в течение следующих 4-х лет. Поэтому я создал временную таблицу, как показано ниже.

DECLARE @tempTable table(YearValue SMALLINT) 
    INSERT INTO @tempTable VALUES (@Year) 
    INSERT INTO @tempTable VALUES (@Year + 1) 
    INSERT INTO @tempTable VALUES (@Year + 2) 
    INSERT INTO @tempTable VALUES (@Year + 3) 

Но как я могу присоединиться к временной таблице с другим запросом.

ответ

0

Попробуйте выполнить нижеследующий запрос. Использует простой JOIN на @temptable

SELECT tt.YearValue [Year] 
    , t.Name AS [Town] 
    , COUNT(r.Id) AS [PropertyCount] 
    , CASE 
     WHEN tt.YearValue - [Age] < 11 THEN '1-10' 
     WHEN tt.YearValue - [Age] BETWEEN 11 AND 20 THEN '11-20' 
     ELSE 'Unknown' 
    END AS [AgeRange] 

FROM 
@tempTable tt LEFT JOIN 
Properties r 
    JOIN Towns t 
     ON t.Id = r.TownId 
    WHERE t.Id = @TownId 
    GROUP BY 
     t.Name, 
    CASE 
     WHEN tt.YearValue - [Age] < 11 THEN '1-10' 
     WHEN tt.YearValue - [Age] BETWEEN 11 AND 20 THEN '11-20' 
     ELSE 'Unknown' 
    END 
0

Вы можете просто использовать CROSS JOIN или INNER JOIN с условием 1 = 1. Вы действительно, наверное, не нужен временной таблицы либо. Кажется, вы используете SQL Server, поэтому я вроде бы предполагаю, что даже если запрос легко адаптируется к другим платформам.

SELECT 
    yr AS "Year", t.Name AS Town, COUNT(r.Id) AS PropertyCount, 
    CASE 
     WHEN yr - Age < 11 THEN '1-10' 
     WHEN yr - Age BETWEEN 11 AND 20 THEN '11-20' 
     ELSE 'Unknown' 
    END AS AgeRange 
FROM 
    Properties as r INNER JOIN Towns as t ON t.Id = r.TownId 
    INNER JOIN (
     SELECT @Year as yr UNION ALL Select @Year + 1 UNION ALL 
     SELECT @Year + 2 UNION ALL SELECT @Year + 3 
    ) AS y ON 1 = 1 /* lots of variations on syntax here depending on your flavor of SQL */ 
WHERE t.Id = @TownId 
GROUP BY 
    yr, 
    t.Name, 
    CASE 
     WHEN yr - Age < 11 THEN '1-10' 
     WHEN yr - Age BETWEEN 11 AND 20 THEN '11-20' 
     ELSE 'Unknown' 
    END 
Смежные вопросы