CTE For a Complex Query

ぃ、小莉子 提交于 2019-12-12 03:05:01

问题


I have this query:

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];

which returns:

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

How do I use a CTE for this query? I know to use the WITH Clause, but I can't get it to work because the query is complex. I'm using this for reference: http://www.codeproject.com/Articles/265371/Common-Table-Expressions-CTE-in-SQL-SERVER but it only contains simple examples.

Thanks.


回答1:


Very simple; overlooked the syntax.

 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;



回答2:


That depends on where you want the break at. Usually inline views can be created as a CTE to make the query easier to read... In this case I removed your lineline view and made it the 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];



回答3:


That depends on where you want the break at. Usually inline views can be created as a CTE to make the query easier to read... In this case I removed your lineline view and made it the 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];

or you could build on ctes...

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;


来源:https://stackoverflow.com/questions/40471935/cte-for-a-complex-query

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!