2016-11-07 4 views
0

У меня есть этот запрос:CTE Для сложного запроса

SELECT C.[First Name], 
C.[Last Name], 
SUM(Salary.Emp_Salary) AS 'Current Salary' 

    FROM 
    (
    SELECT 
     Emp_First_Name AS "First Name", 
     Emp_Last_Name AS "Last Name", 

     MAX(Emp_Salary_Change_Year) AS "Change Year" 
     FROM Employee_Details AS e 

    INNER JOIN Country AS co ON e.Emp_Country_Id = co.Country_Id 
    INNER JOIN State AS s ON e.Emp_State_Id = s.State_Id 
    INNER JOIN Designation AS d ON e.Desig_Id = d.Desig_Id 
    INNER JOIN Salary AS sa ON e.Emp_Id = sa.Emp_Id 
    WHERE Emp_Active = 1 
    GROUP BY Emp_First_Name, Emp_Last_Name, 
    Emp_Middle_Name, Country_Name, Desig_Name) AS C 
    INNER JOIN Salary ON C.[Change Year] = Salary.Emp_Salary_Change_Year 
group by C.[First Name], 
C.[Last Name]; 

, который возвращает:

First Name Last Name Current Salary 
Chen Chen 76000.00 
Sahi King 156000.00 
Venessa Katarina 185000.00 

Как использовать КТР для этого запроса? Я знаю, что использовать предложение WITH, но я не могу заставить его работать, потому что запрос является сложным. Я использую это для справки: http://www.codeproject.com/Articles/265371/Common-Table-Expressions-CTE-in-SQL-SERVER , но он содержит только простые примеры.

Спасибо.

+0

Даст ли ваш запрос, что вы хотите результатов? –

+0

решил. Мне пришлось добавить предложение SELECT * FROM T после целого cte –

+0

Очень хорошо. Можете ли вы показать свой результат в качестве ответа? –

ответ

1

Очень простой; не учитывается синтаксис.

WITH T([First Name], [Last Name], [Current Salary]) 
AS 
(

SELECT C.[First Name], 
C.[Last Name], 

SUM(Salary.Emp_Salary) AS 'Current Salary' 

    FROM 
    (
    SELECT 
     Emp_First_Name AS "First Name", 
     Emp_Last_Name AS "Last Name", 

     MAX(Emp_Salary_Change_Year) AS "Change Year" 
     FROM Employee_Details AS e 

    INNER JOIN Country AS co ON e.Emp_Country_Id = co.Country_Id 
    INNER JOIN State AS s ON e.Emp_State_Id = s.State_Id 
    INNER JOIN Designation AS d ON e.Desig_Id = d.Desig_Id 
    INNER JOIN Salary AS sa ON e.Emp_Id = sa.Emp_Id 
    WHERE Emp_Active = 1 
    GROUP BY Emp_First_Name, Emp_Last_Name, 
    Emp_Middle_Name, Country_Name, Desig_Name) AS C 
    INNER JOIN Salary ON C.[Change Year] = Salary.Emp_Salary_Change_Year 
group by C.[First Name], 
C.[Last Name] 
) 
SELECT * FROM T; 
0

Это зависит от того, где вы хотите переехать. Обычно встроенные представления могут быть созданы как CTE, чтобы упростить чтение запроса ... В этом случае я удалил ваш вид линии и сделал его CTE.

With C as (
    (
    SELECT 
     Emp_First_Name AS "First Name", 
     Emp_Last_Name AS "Last Name", 

     MAX(Emp_Salary_Change_Year) AS "Change Year" 
     FROM Employee_Details AS e 

    INNER JOIN Country AS co ON e.Emp_Country_Id = co.Country_Id 
    INNER JOIN State AS s ON e.Emp_State_Id = s.State_Id 
    INNER JOIN Designation AS d ON e.Desig_Id = d.Desig_Id 
    INNER JOIN Salary AS sa ON e.Emp_Id = sa.Emp_Id 
    WHERE Emp_Active = 1 
    GROUP BY Emp_First_Name, Emp_Last_Name, 
    Emp_Middle_Name, Country_Name, Desig_Name) 

SELECT C.[First Name] 
    , C.[Last Name], 
    SUM(Salary.Emp_Salary) AS 'Current Salary' 
FROM C 
INNER JOIN Salary 
    ON C.[Change Year] = Salary.Emp_Salary_Change_Year 
GROUP BY C.[First Name] 
     ,C.[Last Name]; 
0

Это зависит от того, где вы хотите переехать. Обычно встроенные представления могут быть созданы как CTE, чтобы упростить чтение запроса ... В этом случае я удалил ваш вид линии и сделал его CTE.

With C as (
    (
    SELECT 
     Emp_First_Name AS "First Name", 
     Emp_Last_Name AS "Last Name", 

     MAX(Emp_Salary_Change_Year) AS "Change Year" 
     FROM Employee_Details AS e 

    INNER JOIN Country AS co ON e.Emp_Country_Id = co.Country_Id 
    INNER JOIN State AS s ON e.Emp_State_Id = s.State_Id 
    INNER JOIN Designation AS d ON e.Desig_Id = d.Desig_Id 
    INNER JOIN Salary AS sa ON e.Emp_Id = sa.Emp_Id 
    WHERE Emp_Active = 1 
    GROUP BY Emp_First_Name, Emp_Last_Name, 
    Emp_Middle_Name, Country_Name, Desig_Name) 

SELECT C.[First Name] 
    , C.[Last Name], 
    SUM(Salary.Emp_Salary) AS 'Current Salary' 
FROM C 
INNER JOIN Salary 
    ON C.[Change Year] = Salary.Emp_Salary_Change_Year 
GROUP BY C.[First Name] 
     ,C.[Last Name]; 

или вы могли бы построить на КТР ...

With C as (
    (
    SELECT 
     Emp_First_Name AS "First Name", 
     Emp_Last_Name AS "Last Name", 

     MAX(Emp_Salary_Change_Year) AS "Change Year" 
     FROM Employee_Details AS e 

    INNER JOIN Country AS co ON e.Emp_Country_Id = co.Country_Id 
    INNER JOIN State AS s ON e.Emp_State_Id = s.State_Id 
    INNER JOIN Designation AS d ON e.Desig_Id = d.Desig_Id 
    INNER JOIN Salary AS sa ON e.Emp_Id = sa.Emp_Id 
    WHERE Emp_Active = 1 
    GROUP BY Emp_First_Name, Emp_Last_Name, 
    Emp_Middle_Name, Country_Name, Desig_Name), 
CTE2 as ( 
    SELECT C.[First Name] 
     , C.[Last Name], 
     SUM(Salary.Emp_Salary) AS 'Current Salary' 
    FROM C 
    INNER JOIN Salary 
     ON C.[Change Year] = Salary.Emp_Salary_Change_Year 
    GROUP BY C.[First Name] 
      ,C.[Last Name]) 
SELECT * 
FROM CTE2; 

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

  • Нет связанных вопросов^_^