Click here to Skip to main content
15,886,035 members
Please Sign up or sign in to vote.
0.00/5 (No votes)
Hi members,

For example I have 2 or more WITH clause statement something like below:
How do I union multiple WITH clause statements together? thanks
SQL
--WITH clause 1

WITH Sales_CTE (SalesPersonID, SalesOrderID, SalesYear)
AS
(
    SELECT SalesPersonID, SalesOrderID, YEAR(OrderDate) AS SalesYear
    FROM Sales.SalesOrderHeader
    WHERE SalesPersonID IS NOT NULL
)
SELECT SalesPersonID, COUNT(SalesOrderID) AS TotalSales, SalesYear
FROM Sales_CTE
GROUP BY SalesYear, SalesPersonID

--WITH clause 2

WITH Sales_CTE (SalesPersonID, SalesOrderID, SalesYear)
AS

(
    SELECT SalesPersonID, SalesOrderID, YEAR(OrderDate) AS SalesYear
    FROM Sales.SalesOrderHeader
    WHERE SalesPersonID IS NOT NULL
)
SELECT SalesPersonID, COUNT(SalesOrderID) AS TotalSales, SalesYear
FROM Sales_CTE
GROUP BY SalesYear, SalesPersonID

--WITH clause 3

WITH Sales_CTE (SalesPersonID, SalesOrderID, SalesYear)
AS

(
    SELECT SalesPersonID, SalesOrderID, YEAR(OrderDate) AS SalesYear
    FROM Sales.SalesOrderHeader
    WHERE SalesPersonID IS NOT NULL
)
SELECT SalesPersonID, COUNT(SalesOrderID) AS TotalSales, SalesYear
FROM Sales_CTE
GROUP BY SalesYear, SalesPersonID 
Posted
Updated 8-Jun-23 2:43am
v2

As far as I know you can't use UNION on two separate CTE's.
Some options you have:
- Place queries inside a single CTE and use union inside the one CTE
- Don't use CTE but 'traditional' SELECT statements
- Create a view for a single CTE and combine them

Examples
All-in
SQL
WITH Sales_CTE (SalesPersonID, SalesOrderID, SalesYear)
AS
(
    SELECT SalesPersonID, SalesOrderID, YEAR(OrderDate) AS SalesYear
    FROM Sales.SalesOrderHeader
    WHERE SalesPersonID IS NOT NULL
    UNION ALL
    SELECT SalesPersonID, SalesOrderID, YEAR(OrderDate) AS SalesYear
    FROM Sales.SalesOrderHeader
    WHERE SalesPersonID IS NOT NULL

)
SELECT SalesPersonID, COUNT(SalesOrderID) AS TotalSales, SalesYear
FROM Sales_CTE
GROUP BY SalesYear, SalesPersonID

No CTE
SQL
SELECT SalesPersonID, SalesOrderID, YEAR(OrderDate) AS SalesYear
FROM Sales.SalesOrderHeader
WHERE SalesPersonID IS NOT NULL
UNION ALL
SELECT SalesPersonID, SalesOrderID, YEAR(OrderDate) AS SalesYear
FROM Sales.SalesOrderHeader
WHERE SalesPersonID IS NOT NULL

View
SQL
CREATE VIEW Sales1 AS
WITH Sales_CTE (SalesPersonID, SalesOrderID, SalesYear)
AS
(
    SELECT SalesPersonID, SalesOrderID, YEAR(OrderDate) AS SalesYear
    FROM Sales.SalesOrderHeader
    WHERE SalesPersonID IS NOT NULL
)
SELECT SalesPersonID, COUNT(SalesOrderID) AS TotalSales, SalesYear
FROM Sales_CTE
GROUP BY SalesYear, SalesPersonID
 
CREATE VIEW Sales2 AS
WITH Sales_CTE (SalesPersonID, SalesOrderID, SalesYear)
AS
 
(
    SELECT SalesPersonID, SalesOrderID, YEAR(OrderDate) AS SalesYear
    FROM Sales.SalesOrderHeader
    WHERE SalesPersonID IS NOT NULL
)
SELECT SalesPersonID, COUNT(SalesOrderID) AS TotalSales, SalesYear
FROM Sales_CTE
GROUP BY SalesYear, SalesPersonID

SELECT SalesPersonID,TotalSales, SalesYear FROM Sales1
UNION 
SELECT SalesPersonID,TotalSales, SalesYear FROM Sales2
 
Share this answer
 
v2
Comments
aarif moh shaikh 2-Oct-15 0:21am    
good one.. thanks
select * from (with1 ***) t1
union all
select * from (with2 ***) t2
 
Share this answer
 
Comments
CHill60 8-Jun-23 12:21pm    
Quite apart from the fact the question was answered nearly 8 years ago, your suggestion is syntactically incorrect and will generate an error "Incorrect syntax near the keyword 'WITH'"
Perhaps you meant
WITH with1 AS (***),
with2 AS (***)
SELECT * from with1
UNION
SELECT * from with2;
Member 16024872 9-Jun-23 8:59am    
your code's incorrect.
i did mean this:
select * from (with temp1 as (select * from foo) ) t1
union all
select * from (with temp2 as (select * from foo) ) t2

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900