Reputation: 53
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.
Upvotes: 0
Views: 1508
Reputation: 35323
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;
Upvotes: 0
Reputation: 35323
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];
Upvotes: 0
Reputation: 53
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;
Upvotes: 1