2017-01-24 15 views
-1

我一直在與同級進行查詢,並且它已經開始回退一些不尋常的數字。查詢是一個生產力報告。我試圖將特定最終用戶的所有可結算單位總和,並將其與單個預期值進行比較,然後計算1個星期內這兩個數字之間的差異。下面是我們已經想出迄今:SQL查詢總數與單個值的比較

SELECT 
Employees.emp_id, 
Employees.last_name+', '+Employees.first_name as staff_name, 
SUM(VisitQuery.billed_value)/60 AS billed_value, 
SUM(StandardQuery.num8) as expected_value 
FROM 
Employees 
INNER JOIN 
(
    SELECT 
    ClientVisit.duration AS billed_value, 
    ClientVisit.emp_id, 
    ClientVisit.client_id 
    FROM 
    ClientVisit 
    WHERE 
    ClientVisit.non_billable = 0 AND 
    ClientVisit.rev_timeout >= @param1 AND 
    ClientVisit.rev_timeout <= @param2 
) VisitQuery 
ON VisitQuery.emp_id = Employees.emp_id 
INNER JOIN 
(
SELECT DISTINCT 
    CaseloadQuery.emp_id, 
    ClientsExt.num8 
FROM 
(
    SELECT 
    ClientVisit.duration AS billed_value, 
    ClientVisit.emp_id, 
    ClientVisit.client_id 
    FROM 
    ClientVisit 
    WHERE 
    ClientVisit.non_billable = 0 AND 
    ClientVisit.rev_timeout >= @param1 AND 
    ClientVisit.rev_timeout <= @param2 
) CaseloadQuery 
INNER JOIN ClientsExt 
ON CaseloadQuery.client_id = ClientsExt.client_id 
) StandardQuery 
ON Employees.emp_id = StandardQuery.emp_id 
GROUP BY 
Employees.emp_id, 
Employees.last_name+', '+Employees.first_name`enter code here` 

返回找出來是這樣的:

emp_id  staff_name  billed_value expected_value 
X   X    74    231 
XX   XX    108    279 
XXX   XXX    19    72 

沒有人有什麼想法?本週的預期值應該不會高於40小時。

+0

你能提供的類/域圖?這將是真正有幫助的,歡呼 – Tatranskymedved

+0

我很抱歉,但我相對較新的SQL,所以我不完全確定你在問我要什麼。 –

+0

在ClientVisit表中,同一個員工('emp_id')可以有多行,導致多個'client_id'的值? – leeyuiwah

回答

0

在表ClientVisit中,同一位員工(emp_id)是否有多​​行可導致client_id的多個值?如果答案是肯定的,那麼我認爲你也應該做一個GROUP BYclient_id

下面我試着重寫你的查詢(注意標有「添加」和「刪除」的行)。

免責聲明:我沒有實際的數據庫表來測試我的查詢,所以它可能具有的語法和語義錯誤

SELECT 
    Employees.emp_id, 
    StandardQuery.client_id,          -- add 
    Employees.last_name+', '+Employees.first_name as staff_name, 
    SUM(VisitQuery.billed_value)/60 AS billed_value, 
    SUM(StandardQuery.num8) as expected_value 
FROM 
    Employees 
    INNER JOIN 
     (
      SELECT 
       ClientVisit.duration AS billed_value, 
       ClientVisit.emp_id, 
       ClientVisit.client_id 
      FROM 
       ClientVisit 
      WHERE 
       ClientVisit.non_billable = 0 AND 
       ClientVisit.rev_timeout >= @param1 AND 
       ClientVisit.rev_timeout <= @param2 
     ) VisitQuery 
     ON VisitQuery.emp_id = Employees.emp_id 
    INNER JOIN 
     (
      SELECT DISTINCT 
       CaseloadQuery.emp_id, 
       ClientsExt.num8, 
       ClientsExt.client_id        -- add 
      FROM 
       (
        SELECT 
         -- ClientVisit.duration AS billed_value, -- delete 
         ClientVisit.emp_id, 
         ClientVisit.client_id 
        FROM 
         ClientVisit 
        WHERE 
         ClientVisit.non_billable = 0 AND 
         ClientVisit.rev_timeout >= @param1 AND 
         ClientVisit.rev_timeout <= @param2 
       )CaseloadQuery 
       INNER JOIN ClientsExt 
        ON CaseloadQuery.client_id = ClientsExt.client_id 
     )StandardQuery 
      ON Employees.emp_id = StandardQuery.emp_id 
GROUP BY 
    Employees.emp_id, 
    -- Employees.last_name+', '+Employees.first_name    -- delete 
    StandardQuery.client_id           -- add