У меня есть пользователь, которому нужны сводные данные в отчете. Я могу получить правильные данные, используя два отдельных запроса SQL, и они следующие.
SELECT JH.ProjectID, SUM(EstProdHours) AS EstProdHrs, SUM(ActProdHours)
AS ActProdHrs
FROM JobOper AS JO INNER JOIN JobHead AS JH ON JO.Company = JH.Company AND
JO.JobNum = JH.JobNum WHERE JH.ProjectID <> ''
GROUP BY JH.ProjectID ORDER BY JH.ProjectID
SELECT JH.ProjectID, SUM(EstProdHours) + SUM(EstSetHours) AS Earned
FROM JobOper AS JO INNER JOIN JobHead AS JH ON JO.Company = JH.Company AND
JO.JobNum = JH.JobNum WHERE JH.ProjectID <> '' AND OpComplete = 1
GROUP BY JH.ProjectID ORDER BY JH.ProjectID
Эти два отдельных запроса сами по себе предоставляют правильные данные. Однако моя цель - настроить представление SQL с результатами этих двух запросов вместе с результатом, как показано ниже:
ProjectID EstProdHrs ActProdHrs Earned
6000 480.00 1640.59 477
6001 621.00 2431.04 619
6002 6687.97 23234.23 6695.47
6003 414.97 4731.47 416.72
6004 208.00 2196.52 206.00
6005 2.00 76.77 NULL <--- This would show up if no completed ops in 2nd select statement
6006 20.83 819.29 18.83
Я попытался внутренне объединить два запроса и, похоже, не могу избежать «неправильных синтаксических ошибок». Вот это заявление:
SELECT * FROM
(SELECT JH.ProjectID, SUM(EstProdHours) AS EstProdHrs, SUM(ActProdHours) AS
ActProdHrs,'N/A' AS ValueMissingTableB
FROM JobOper AS JO INNER JOIN JobHead AS JH ON JO.Company = JH.Company AND
JO.JobNum = JH.JobNum WHERE JH.ProjectID <> ''
) AS 1
INNER JOIN
(SELECT JH2.ProjectID, SUM(EstProdHours) + SUM(EstSetHours) AS Earned
FROM JobOper AS JO2 INNER JOIN JobHead AS JH2 ON JO2.Company = JH2.Company
AND JO2.JobNum = JH2.JobNum WHERE JH2.ProjectID <> '' AND OpComplete = 1
) AS 2
ON 1.ProjectID = 2.ProjectID
Я также пробовал UNION и UNION ALL, и это не удалось, потому что два запроса не имеют одинакового количества записей. Я надеюсь, что делаю здесь ошибку новичка, и это можно сделать. Спасибо за понимание.
Спасибо, Серж.
У меня нет ваших таблиц, чтобы проверить это, но вы не можете просто выполнить левое соединение;
SELECT A.ProjectID,A.EstProdHrs, A.ActProdHrs, E.Earned
FROM (
SELECT JH.ProjectID, SUM(EstProdHours) AS EstProdHrs, SUM(ActProdHours) AS ActProdHrs
FROM JobOper AS JO INNER JOIN JobHead AS JH ON JO.Company = JH.Company AND
JO.JobNum = JH.JobNum WHERE JH.ProjectID <> ''
GROUP BY JH.ProjectID
) A
LEFT JOIN (
SELECT JH.ProjectID, SUM(EstProdHours) + SUM(EstSetHours) AS Earned
FROM JobOper AS JO INNER JOIN JobHead AS JH ON JO.Company = JH.Company AND
JO.JobNum = JH.JobNum WHERE JH.ProjectID <> '' AND OpComplete = 1
GROUP BY JH.ProjectID
) E
ON A.ProjectID=E.ProjectID
ORDER BY A.ProjectID
Это сработало. Спасибо много. Мне даже в голову не пришло попробовать левое соединение.
Нет проблем - вы сказали, что вы новичок в работе с SQL - возможно, стоит взглянуть на различные типы соединений, эта страница ясно их объясняет; w3schools.com/sql/sql_join.asp
Попробуй это :
WITH A AS (SELECT JH.ProjectID, SUM(EstProdHours) AS EstProdHrs, SUM(ActProdHours) AS
ActProdHrs,'N/A' AS ValueMissingTableB
FROM JobOper AS JO INNER JOIN JobHead AS JH ON JO.Company = JH.Company AND
JO.JobNum = JH.JobNum WHERE JH.ProjectID <> ''
GROUP BY JH.ProjectID ORDER BY JH.ProjectID
),
B AS
(SELECT JH2.ProjectID, SUM(EstProdHours) + SUM(EstSetHours) AS Earned
FROM JobOper AS JO2 INNER JOIN JobHead AS JH2 ON JO2.Company = JH2.Company
AND JO2.JobNum = JH2.JobNum WHERE JH2.ProjectID <> '' AND OpComplete = 1
GROUP BY JH2.ProjectID ORDER BY JH2.ProjectID
)
SELECT * FROM A
JOIN B ON A.ProjectID = B.ProjectID
Ответ Джеймса сработал. Я попробовал ваше решение и получил ошибку
Msg 8120, уровень 16, состояние 1, строка 1 Столбец «JobHead.ProjectID» недопустим в списке выбора, поскольку он не содержится ни в агрегатной функции, ни в предложении GROUP BY.
Извините, я отредактировал свой запрос, чтобы добавить группу, возможно, это было причиной ошибки, но если нет, тогда хорошо
Используйте вместо этого LEFT JOIN