我正在执行下面的查询,但当我们没有“LastMonth”和“CurrentMonth”的任何记录时,会返回重复的行。请告诉我问题出在哪里?
**Output:**
Project ProCount CurrentDateAvg thisWeekAvg thisMonthAvg lastMonthAvg
xyz 0 0 0.19 0.09 0
xyz 5 0 0.0 0.0 0
WITH
ThisWeek AS (SELECT 'xyz' as 'Project_Name', 0.19 as 'thisWeekAvg' ),
ThisMonth AS ( SELECT 'xyz' as 'Project_Name', 0.09 as 'thisMonthAvg'),
LastMonth AS( SELECT 'xyz' as 'Project_Name', 0 as 'lastMonthAvg' where 1=2),
CurrentDate AS( SELECT 'xyz' as 'Project_Name', 0 as 'CurrentDateAvg' where 1=2),
ProjectCount AS( SELECT 'xyz' as 'Project_Name', 5 AS 'ProCount' )
SELECT
COALESCE(w.Project_Name, m.Project_Name, l.Project_Name,c.Project_Name,pc.Project_Name) AS 'Project',
COALESCE(pc.ProCount,0) 'ProCount',
COALESCE(c.CurrentDateAvg,0) 'CurrentDateAvg',
COALESCE(w.thisWeekAvg,0) 'thisWeekAvg',
COALESCE(m.thisMonthAvg,0) 'thisMonthAvg',
COALESCE(l.lastMonthAvg,0) 'lastMonthAvg'
FROM
ThisWeek w
FULL OUTER JOIN ThisMonth m ON w.Project_Name = m.Project_Name
FULL OUTER JOIN LastMonth l ON m.Project_Name = l.Project_Name
FULL OUTER JOIN ProjectCount pc ON l.Project_Name = pc.Project_Name
FULL OUTER JOIN CurrentDate c ON pc.Project_Name = c.Project_Name
这是预期的行为,因为您没有在
NULL
中处理 JOIN
值。
为了方便起见,让我们给它们编号:
ThisWeek w --1
FULL OUTER JOIN ThisMonth m ON w.Project_Name = m.Project_Name --2
FULL OUTER JOIN LastMonth l ON m.Project_Name = l.Project_Name --3
FULL OUTER JOIN ProjectCount pc ON l.Project_Name = pc.Project_Name --4
FULL OUTER JOIN CurrentDate c ON pc.Project_Name = c.Project_Name --5
所以我们有:
JOIN
到本月(无行 JOIN
ed)OIN
至上个月(无行 JOIN
ed)JOIN
没有行;由于 FULL OUTER JOIN
创建一个新行。 NULL <> 'xyz'
对于这样的东西,您可能需要一个
IN
:
WITH
ThisWeek AS (
SELECT
'xyz' AS Project_Name,
0.19 AS thisWeekAvg
),
ThisMonth AS (
SELECT
'xyz' AS Project_Name,
0.09 AS thisMonthAvg
),
LastMonth AS (
SELECT
'xyz' AS Project_Name,
0 AS lastMonthAvg
WHERE
1 = 2
),
CurrentDate AS (
SELECT
'xyz' AS Project_Name,
0 AS CurrentDateAvg
WHERE
1 = 2
),
ProjectCount AS (
SELECT
'xyz' AS Project_Name,
5 AS ProCount
)
SELECT
COALESCE(
w.Project_Name,
m.Project_Name,
l.Project_Name,
c.Project_Name,
pc.Project_Name
) AS Project,
COALESCE(pc.ProCount, 0) ProCount,
COALESCE(c.CurrentDateAvg, 0) CurrentDateAvg,
COALESCE(w.thisWeekAvg, 0) thisWeekAvg,
COALESCE(m.thisMonthAvg, 0) thisMonthAvg,
COALESCE(l.lastMonthAvg, 0) lastMonthAvg
FROM
ThisWeek w
FULL OUTER JOIN ThisMonth m ON w.Project_Name = m.Project_Name --WE don't need an IN here
FULL OUTER JOIN LastMonth l ON l.Project_Name IN (w.Project_Name,m.Project_Name)
FULL OUTER JOIN ProjectCount pc ON pc.Project_Name IN (w.Project_Name,m.Project_Name,l.Project_Name)
FULL OUTER JOIN CurrentDate c ON c.Project_Name IN (w.Project_Name,m.Project_Name,l.Project_Name,pc.Project_Name);