Объедините два запроса SQL Server в один набор данных - PullRequest
0 голосов
/ 24 октября 2018

У меня есть пользователь, которому нужны итоговые данные в отчете.Я могу получить правильные данные, используя два отдельных запроса 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

Я попытался внутренне объединить два запроса, и я не могу избежатьmsgstr "неверные синтаксические ошибки".Вот это утверждение:

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, и это не удалось, потому что два запроса не имеют одинаковое количество записей.Я надеюсь, что я делаю ошибку новичка здесь, и это может быть сделано.Спасибо за понимание.

Ответы [ 2 ]

0 голосов
/ 24 октября 2018

Попробуйте это:

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
0 голосов
/ 24 октября 2018

У меня нет ваших таблиц, чтобы проверить это, но я не могу просто сделать левое соединение;

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
...