Как я могу присоединить таблицу к себе в T-SQL? - PullRequest
1 голос
/ 11 июня 2009

У меня следующий запрос:

SELECT [ApplicationTitle] AS "ApplicationTitle", 
SUM([Visits]) AS "Visits",
SUM([NewVisits]) AS "NewVisits"
FROM [HeadlineFigures] 
WHERE [DataDate] >= '01/06/2009'
AND [DataDate] < '08/06/2009'
GROUP BY [ApplicationTitle]
ORDER BY [ApplicationTitle]

Возвращает данные за 7 дней. Я хочу то же самое снова, в том же запросе для другой недели, поэтому он должен выглядеть примерно так:

SELECT a.[ApplicationTitle] AS "ApplicationTitle", 
SUM(a.[Visits]) AS "Visits",
SUM(b.[Visits]) AS "PVisits",
SUM(a.[NewVisits]) AS "NewVisits"
SUM(b.[NewVisits]) AS "PNewVisits"
FROM [HeadlineFigures] a JOIN [HeadlineFigures] b
ON a.[ApplicationTitle] = b.[ApplicationTitle]
WHERE a.[DataDate] >= '01/06/2009'
AND a.[DataDate] < '08/06/2009'
AND b.[DataDate] >= '01/05/2009'
AND b.[DataDate] < '08/05/2009'
GROUP BY a.[ApplicationTitle]
ORDER BY a.[ApplicationTitle]

Вышеуказанный запрос неверен. Что я делаю не так?

Ответы [ 2 ]

2 голосов
/ 11 июня 2009

Ваше объединение затем агрегирует, что приводит к неправильным агрегатам. То есть. если для ApplicationTitle у вас есть 2 записи в первом наборе и 2 во втором, объединение будет иметь 4 записи, поэтому SUM удваивается. Сначала вам нужно объединиться, затем присоединиться:

SELECT a.[ApplicationTitle],
    a.Visits,
    a.NewVisists,
    b.Visits as PVisits,
    b.NewVisits as PNewVisits
    FROM (
    SELECT [ApplicationTitle] AS "ApplicationTitle", 
        SUM([Visits]) AS "Visits",
        SUM([NewVisits]) AS "NewVisits"
        FROM [HeadlineFigures] 
        WHERE [DataDate] >= '01/06/2009'
        AND [DataDate] < '08/06/2009'
        GROUP BY [ApplicationTitle]
    ) AS a JOIN (
    SELECT [ApplicationTitle] AS "ApplicationTitle", 
        SUM([Visits]) AS "Visits",
        SUM([NewVisits]) AS "NewVisits"
        FROM [HeadlineFigures] 
        WHERE [DataDate] >= '01/05/2009'
        AND [DataDate] < '08/05/2009'
        GROUP BY [ApplicationTitle]
    ) AS b ON a.[ApplicationTitle] = b.[ApplicationTitle]
        ORDER BY [ApplicationTitle]
0 голосов
/ 11 июня 2009

Если я что-то не упускаю полностью, вы делаете вещи слишком сложными. Попробуйте вместо этого:

SELECT [ApplicationTitle] AS "ApplicationTitle",
       SUM(CASE WHEN [DataDate] >= '01/06/2009' AND [DataDate] < '08/06/2009' THEN [Visits] ELSE 0 END) AS "Visits",
       SUM(CASE WHEN [DataDate] >= '01/05/2009' AND [DataDate] < '08/05/2009' THEN  [Visits] ELSE 0 END) AS "PVisits",
       SUM(CASE WHEN [DataDate] >= '01/06/2009' AND [DataDate] < '08/06/2009' THEN [NewVisits] ELSE 0 END) AS "NewVisits",
       SUM(CASE WHEN [DataDate] >= '01/05/2009' AND [DataDate] < '08/05/2009' THEN [NewVisits] ELSE 0 END) AS "PNewVisits",
  FROM [HeadlineFigures]
 WHERE    ([DataDate] >= '01/06/2009' AND [DataDate] < '08/06/2009')
       OR ([DataDate] >= '01/05/2009' AND [DataDate] < '08/05/2009')
 GROUP BY [ApplicationTitle]
 ORDER BY [ApplicationTitle]

Редактировать: К сожалению, я неправильно прочитал диапазон данных. Я надеюсь, что SQL-сервер хорошо справится с использованием индекса по DataDate, иначе предложение from должно выглядеть примерно так:

FROM (SELECT * FROM [ApplicationTitle] WHERE [DataDate] >= '01/06/2009' AND [DataDate] < '08/06/2009'
      UNION
      SELECT * FROM [ApplicationTitle] WHERE [DataDate] >= '01/05/2009' AND [DataDate] < '08/05/2009') x
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...