0

这是问题所在:

CREATE TABLE #datesX
    (
    [Name] [varchar] (8) NULL
    , [MarriedDate] datetime NULL
    , [HappyScoreX] [int] NULL
    ) 
INSERT INTO #datesX 
    values 
     ('TIM', null, 20),
     ('RAJ', '01 jan 2012', 20),
     ('PAUL', '01 jan 1960', 20)


CREATE TABLE #datesY
    (
    [Name] [varchar] (8) NULL
    , [FirstSprogDate] datetime NULL
    , [HappyScoreY] [int] NULL
    ) 
INSERT INTO #datesY 
    values 
     ('TIM', '01 jan 1995', 20),
     ('RAJ', '20 JUN 2013', 20),
     ('JASE', null, 20),
     ('PAUL', '01 jan 1970', 20)


CREATE TABLE #datesZ
    (
    [Name] [varchar] (8) NULL
    , [FoundGodDate] datetime NULL
    , [HappyScoreZ] [int] NULL
    ) 
INSERT INTO #datesZ 
    values 
     ('TIM', null, 20),
     ('RAJ', null, 20),
     ('JASE', '01 DEC 2012', 20),
     ('PAUL', '01 jan 1970', 20)




SELECT 
        [Name] = COALESCE(x.Name, y.Name, z.Name), 
        x.[MarriedDate],
        y.[FirstSprogDate],
        z.[FoundGodDate],
        [HappyScoreX] = SUM(ISNULL(x.[HappyScoreX],0.0)),
        [HappyScoreY] = SUM(ISNULL(y.[HappyScoreY],0.0)),
        [HappyScoreZ] = SUM(ISNULL(z.[HappyScoreZ],0.0))
FROM 
        #datesX x
        FULL OUTER JOIN #datesY y ON
                x.Name = y.Name 
        FULL OUTER JOIN #datesZ z ON
                x.Name = z.Name 
GROUP BY
        COALESCE(x.Name, y.Name, z.Name), 
        x.[MarriedDate],
        y.[FirstSprogDate],
        z.[FoundGodDate]

我可以看到为什么记录JASE被重复 - 我如何修改查询以便JASE只有一条记录?

4

4 回答 4

3

试试这个加入:

FULL OUTER JOIN #datesY y ON
       x.Name = y.Name 
FULL OUTER JOIN #datesZ z ON
       coalesce(x.Name, y.name) = z.Name 
于 2012-11-14T14:27:05.417 回答
1

您希望每个名称一行。我的建议是先建立密钥,然后去获取行。

CREATE TABLE #nameKeys
(
  [Name] varchar(8) NOT NULL PRIMARY KEY
)

INSERT INTO #nameKeys ([Name])
SELECT DISTINCT [Name] FROM #datesX WHERE [Name] is not null
UNION
SELECT DISTINCT [Name] FROM #datesYY WHERE [Name] is not null
UNION
SELECT DISTINCT [Name] FROM #datesZ WHERE [Name] is not null


--Then later...

FROM
  #nameKeys n
  LEFT JOIN #datesX x ON n.[Name] = x.[Name]
  LEFT JOIN #datesY y ON n.[Name] = y.[Name]
  LEFT JOIN #datesZ z ON n.[Name] = z.[Name]
于 2012-11-14T14:26:29.490 回答
1

您遇到的麻烦是您FULL OUTER JOINS在#datesX 上有两个。由于#datesX 中没有行,因为JASE您有行,因此您从 Y 和 Z 表中返回行,但最后一个 Full 外部说明您应该将 X.Name 与 Z.Name 匹配。下面的代码会给你你想要的(我认为|)

SELECT 
        [Name] = COALESCE(x.Name, y.Name, z.Name), 
        x.[MarriedDate],
        y.[FirstSprogDate],
        z.[FoundGodDate],
        [HappyScoreX] = SUM(ISNULL(x.[HappyScoreX],0.0)),
        [HappyScoreY] = SUM(ISNULL(y.[HappyScoreY],0.0)),
        [HappyScoreZ] = SUM(ISNULL(z.[HappyScoreZ],0.0))
FROM 
        #datesX x
        FULL OUTER JOIN #datesY y ON
                x.Name = y.Name 
        FULL OUTER JOIN #datesZ z ON
                z.Name = COALESCE(x.Name, y.Name)
GROUP BY
        COALESCE(x.Name, y.Name, z.Name), 
        x.[MarriedDate],
        y.[FirstSprogDate],
        z.[FoundGodDate]
于 2012-11-14T14:39:43.810 回答
1

为了进一步建立大卫 B 的答案,使用 a 是有意义的Common Table Expression

;WITH NameKeys
AS
(
    SELECT DISTINCT [Name] FROM #datesX WHERE [Name] is not null
    UNION
    SELECT DISTINCT [Name] FROM #datesYY WHERE [Name] is not null
    UNION
    SELECT DISTINCT [Name] FROM #datesZ WHERE [Name] is not null
)
SELECT 
        n.[Name], 
        x.[MarriedDate],
        y.[FirstSprogDate],
        z.[FoundGodDate],
        [HappyScoreX] = SUM(ISNULL(x.[HappyScoreX],0.0)),
        [HappyScoreY] = SUM(ISNULL(y.[HappyScoreY],0.0)),
        [HappyScoreZ] = SUM(ISNULL(z.[HappyScoreZ],0.0))
FROM NameKeys n
LEFT JOIN #datesX x ON n.[Name] = x.[Name]
LEFT JOIN #datesY y ON n.[Name] = y.[Name]
LEFT JOIN #datesZ z ON n.[Name] = z.[Name]
于 2012-11-14T23:39:27.153 回答