根据第一个 table 中的存在,将来自另一个 table 的数据附加到组中
Append Group with data from another table based on its existence in first table
我有一个table这样的
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
我有另一个 table 这些数据
PhaseCode PhaseName
------------------------------
Phase1 Select
Phase2 Develop
Phase3 Deploy
Phase4 Close
基于第二个 table 我需要找出每个项目代码缺少哪些阶段
所以我需要得到这样的结果
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
我试过交叉连接它不起作用,因为它为第一个 table 中的每个项目创建了 4 个条目。那么我怎样才能达到上述结果检查每个组是否存在阶段?
所以我期望的是将每组 PCode 附加到阶段 table 中的 PCode,但仅附加那些不在第一组中的 PCode
试试这个:
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
为了更好地理解查询的工作原理,您可以查看派生的行 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
我有一个table这样的
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
我有另一个 table 这些数据
PhaseCode PhaseName
------------------------------
Phase1 Select
Phase2 Develop
Phase3 Deploy
Phase4 Close
基于第二个 table 我需要找出每个项目代码缺少哪些阶段
所以我需要得到这样的结果
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
我试过交叉连接它不起作用,因为它为第一个 table 中的每个项目创建了 4 个条目。那么我怎样才能达到上述结果检查每个组是否存在阶段?
所以我期望的是将每组 PCode 附加到阶段 table 中的 PCode,但仅附加那些不在第一组中的 PCode
试试这个:
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
为了更好地理解查询的工作原理,您可以查看派生的行 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