返回重复行

问题描述 投票:0回答:1

我正在执行下面的查询,但当我们没有“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
sql sql-server sql-server-2008
1个回答
1
投票

这是预期的行为,因为您没有在

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

所以我们有:

  1. 本周有一个名为“xyz”的项目。
  2. 本月,有一个“xyz”项目加入本周(也有“xyz”)
  3. 上个月,没有项目,到
    JOIN
    到本月(无行
    JOIN
    ed)
  4. 当前数据,无项目,至 J
    OIN
    至上个月(无行
    JOIN
    ed)
  5. 项目计数,项目为“xyz”,到
    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);
© www.soinside.com 2019 - 2024. All rights reserved.