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]

のレコードが複製されている理由を確認できます。レコードが1つだけに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

Common Table ExpressionDavid Bの答えをさらに発展させるには、 :を使用するのが理にかなっています。

;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 に答える
1

名前ごとに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に2つあることです。#datesXには行がないためJASE、YテーブルとZテーブルの両方から行を返しますが、最後の完全な外部は、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 に答える