Совокупная функция, связанная с проблемой в SQL Server - PullRequest
0 голосов
/ 14 июля 2011

Когда я использую следующий запрос:

SELECT  
    AC.iJobID as JobID,
    ROW_NUMBER()OVER (ORDER BY AC.iJobID) AS RowNumber,     
    (SELECT COUNT (*) FROM tbUS_ReferJob WHERE iJobId_FK = 202424 AND sReferredFrom = 'F' AND iUserId_FK = 9550) AS FaceBook_Applications
FROM tbUS_AffiliateJobCount AC,tbUS_ReferJob RJ
WHERE AC.iJobID = 202424 AND RJ.iJobId_FK = 202424
GROUP BY AC.iJobID

Это дает правильный результат.

JobID   RowNumber   FaceBook_Applications
202424  1           2

Но когда я использую запрос ниже

SELECT
    AC.iJobID as JobID,
    ROW_NUMBER()OVER (ORDER BY AC.iJobID) AS RowNumber,     
    SUM(CASE WHEN RJ.sReferredFrom = 'F' THEN 1 ELSE 0 END) AS FaceBook_Applications
FROM tbUS_AffiliateJobCount AC,tbUS_ReferJob RJ
WHERE AC.iJobID = 202424 AND RJ.iJobId_FK = 202424
GROUP BY AC.iJobID

Это дает неправильный результат

JobID   RowNumber   FaceBook_Applications
202424  1           12

Теперь мои вопросы

  1. В чем причина этого?
  2. Как я могу сделать это, используяSUM() функция для снижения стоимости?

Любое предложение будет полезно.

Спасибо за ваше время.

ОБНОВЛЕНИЕ

SELECT  AC.iJobID as JobID,
        ROW_NUMBER()OVER (ORDER BY AC.iJobID) AS RowNumber,     
        SUM(CASE WHEN (RJ.sReferredFrom = 'F' AND RJ.iJobId_FK = 202424 AND RJ.iUserId_FK = 9550) THEN 1 ELSE 0 END) AS FaceBook_Applications
FROM    tbUS_AffiliateJobCount AC,tbUS_ReferJob RJ
WHERE   AC.iJobID = 202424 AND RJ.iJobId_FK = 202424
GROUP BY AC.iJobID

Это дает:

JobID   RowNumber   FaceBook_Applications
202424  1            8

ОБНОВЛЕНИЕ 2

SELECT iJobID_FK, sReferredFrom FROM tbUS_ReferJob WHERE iUserID_FK=9550 AND iJobID_FK=202424 AND sReferredFrom='F'

Результат:

iJobID_FK   sReferredFrom
202424          F
202424          F

Ответы [ 3 ]

1 голос
/ 14 июля 2011

Если я посмотрел правильно, я думаю, что вы пропустили фильтр во втором запросе

AND iUserId_FK = 9550

Второй запрос должен выглядеть следующим образом:

SELECT
    AC.iJobID as JobID,
    ROW_NUMBER()OVER (ORDER BY AC.iJobID) AS RowNumber,     
    SUM(CASE WHEN RJ.sReferredFrom = 'F'  AND iUserId_FK = 9550 THEN 1 ELSE 0 END) AS FaceBook_Applications
FROM tbUS_AffiliateJobCount AC,tbUS_ReferJob RJ
WHERE AC.iJobID = 202424 AND RJ.iJobId_FK = 202424
GROUP BY AC.iJobID

EDIT

Я думаю, что может быть некоторая проблема с условием соединения ... попробуйте сделать более ясное соединение до суммирования

SELECT
    AC.iJobID as JobID,
    ROW_NUMBER()OVER (ORDER BY AC.iJobID) AS RowNumber,     
    SUM(CASE WHEN RJ.sReferredFrom = 'F'   THEN 1 ELSE 0 END) AS FaceBook_Applications
FROM tbUS_AffiliateJobCount AC
JOIN tbUS_ReferJob RJ
ON AC.iJobID =  RJ.iJobId_FK AND Rj.iUserId_FK = 9550
WHERE AC.iJobID = 202424
GROUP BY AC.iJobID

РЕДАКТИРОВАТЬ 2

SELECT
    AC.iJobID as JobID,
    ROW_NUMBER()OVER (ORDER BY AC.iJobID) AS RowNumber,     
    COUNT(*) AS FaceBook_Applications
FROM tbUS_AffiliateJobCount AC
JOIN tbUS_ReferJob RJ
ON AC.iJobID =  RJ.iJobId_FK AND Rj.iUserId_FK = 9550 AND RJ.sReferredFrom = 'F'
WHERE AC.iJobID = 202424
GROUP BY AC.iJobID
1 голос
/ 14 июля 2011

Возьмите ваш второй запрос (я повторю его здесь):

SELECT
    AC.iJobID as JobID,
    ROW_NUMBER()OVER (ORDER BY AC.iJobID) AS RowNumber,     
    SUM(CASE WHEN RJ.sReferredFrom = 'F' THEN 1 ELSE 0 END) AS FaceBook_Applications
FROM tbUS_AffiliateJobCount AC,tbUS_ReferJob RJ
WHERE AC.iJobID = 202424 AND RJ.iJobId_FK = 202424
GROUP BY AC.iJobID

и удалите (или закомментируйте) всю группировку и агрегирование (ранжирование тоже, поскольку это не будет иметь смысла в том, что я предлагаю), например, так:

SELECT
    AC.iJobID as JobID, <b>RJ.iUserId_FK,</b>
    <s>ROW_NUMBER()OVER (ORDER BY AC.iJobID) AS RowNumber,</s>
    <s>SUM(CASE WHEN</s> RJ.sReferredFrom <s>= 'F' THEN 1 ELSE 0 END) AS FaceBook_Applications</s>
FROM tbUS_AffiliateJobCount AC,tbUS_ReferJob RJ
WHERE AC.iJobID = 202424 AND RJ.iJobId_FK = 202424
<s>GROUP BY AC.iJobID</s>

Теперь запустите полученный запрос и посмотрите, сколько F сгенерировано. Я хочу сказать, что результат объединения, скорее всего, содержит много дубликатов, потому что подмножества обеих таблиц возвращают более одной строки, что приводит к старому доброму декартову произведению . Решение может состоять либо в очистке дубликатов в исходных таблицах, если это уместно, либо в уточнении условия WHERE.

1 голос
/ 14 июля 2011

В первом запросе вы ограничиваете подзапрос с помощью:

WHERE iUserId_FK = 9550

Это ограничение отсутствует во втором запросе. Это должно выглядеть так:

SELECT  AC.iJobID as JobID,
        ROW_NUMBER()OVER (ORDER BY AC.iJobID) AS RowNumber,     
        SUM(CASE WHEN RJ.sReferredFrom = 'F' THEN 1 ELSE 0 END) AS FaceBook_Applications
FROM    tbUS_AffiliateJobCount AC,tbUS_ReferJob RJ
WHERE   AC.iJobID = RJ.iJobId_FK 
AND     AC.iJobID = 202424 
AND     RJ.iUserId_FK = 9550
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...