I have a table like this
x
Project Project Name Stage
----------------------------------------
P123 Project1 L1
P123 Project1 L2
P123 Project1 L1
P123 Project1 Phase1
P452 Project2 L1
P452 Project2 L2
P452 Project2 START
P452 Project2 L3
P432 Project3 L1
P432 Project3 L2
P432 Project3 Phase1
P432 Project3 Phase2
I have another table with these data
PhaseCode PhaseName
------------------------------
Phase1 Select
Phase2 Develop
Phase3 Deploy
Phase4 Close
Based on the second table I need to find which phases are missing for each Project codes
So I need to get a result like this
Project Project Name Stage Phase Name Status
----------------------------------------
P123 Project1 L1
P123 Project1 L2
P123 Project1 L1
P123 Project1 Phase1 Select Available
P123 Project1 Phase2 Develop Missing
P123 Project1 Phase3 Deploy Missing
P123 Project1 Phase4 Close Missing
P452 Project2 L1
P452 Project2 L2
P452 Project2 START
P452 Project2 L3
P452 Project2 Phase1 Select Missing
P452 Project2 Phase2 Develop Missing
P452 Project2 Phase3 Deploy Missing
P452 Project2 Phase4 Close Missing
P432 Project3 L1
P432 Project3 L2
P432 Project3 Phase1 Select Available
P432 Project3 Phase2 Develop Available
P452 Project3 Phase3 Deploy Missing
P452 Project3 Phase4 Close Missing
I tried cross join it doesn work since its creating 4 entries for each one item in the first table. So how can I achieve the above result check whether Phase is existing for each group?
So what I am expecting is to append each group of PCodes with that from Phase table but append only those not in first group
Advertisement
Answer
Try this:
SELECT COALESCE(t1.Project, t2.Project) AS Project
, COALESCE(t1.[Project Name], t2.[Project Name]) AS [Project Name]
, COALESCE(t2.Stage, t1.PhaseCode) AS Stage
, t1.PhaseName
, CASE
WHEN PhaseName IS NULL THEN ''
ELSE CASE
WHEN t2.Project IS NULL THEN 'Missing'
ELSE 'Available'
END
END AS Status
FROM (
SELECT DISTINCT Project, [Project Name], PhaseCode, PhaseName
FROM Project
CROSS JOIN Phase
) t1
FULL OUTER JOIN (
SELECT Project, Stage, [Project Name]
FROM Project
) t2 ON t1.Project = t2.Project AND t1.PhaseCode = t2.Stage
ORDER BY COALESCE(t1.Project, t2.Project), Stage
To better understand how the query works you can have a look at the rows of derived table t1
:
Project | Project Name | PhaseCode | PhaseName
--------|-----------------|-----------|------------
P123 | Project1 | Phase1 | Select
P123 | Project1 | Phase2 | Develop
P123 | Project1 | Phase3 | Deploy
P123 | Project1 | Phase4 | Close
P432 | Project3 | Phase1 | Select
P432 | Project3 | Phase2 | Develop
P432 | Project3 | Phase3 | Deploy
P432 | Project3 | Phase4 | Close
P452 | Project2 | Phase1 | Select
P452 | Project2 | Phase2 | Develop
P452 | Project2 | Phase3 | Deploy
P452 | Project2 | Phase4 | Close