2016-09-14 3 views
2

У меня есть 3 таблицы, к которым я пытаюсь присоединиться, и получить сумму одного столбца. У меня с трудом возникает рабочий запрос. Вот таблицыSQL, нахождение суммы на соединенных таблицах

CoinAwards 
+----+------------+------------+-----------+ 
| ID | EmployeeID | AwardDate | CoinLevel | 
+----+------------+------------+-----------+ 
| 1 | 116733  | 6/11/2015 | 1   | 
| 2 | 116359  | 5/20/2016 | 3   | 
| 3 | 116733  | 12/8/2015 | 5   | 
| 4 | 10637  | 10/25/2015 | 2   | 
| 5 | 105197  | 9/15/2016 | 3   | 
+----+------------+------------+-----------+ 

CoinLevels 
+----+-------+ 
| ID | Value | 
+----+-------+ 
| 1 | 5  | 
| 2 | 10 | 
| 3 | 15 | 
| 4 | 50 | 
| 5 | 100 | 
+----+-------+ 

Employees 
+------------+------------+----------+ 
| EmployeeID | FirstName | LastName | 
+------------+------------+----------+ 
| 116733 | John  | Doe  | 
| 116359 | Jason  | Watson | 
| 10637  | Brandon | Wilson | 
| 105197 | Mike  | Jones | 
+------------+------------+----------+ 

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

RESULT: Total Sum of Coin Values given in 2015 
+------------+------------+----------+-------------------------+ 
| EmployeeID | FirstName | LastName | Sum_Of_2015_Coin_Values | 
+------------+------------+----------+-------------------------+ 
| 116733 | John  | Doe  | 105      | 
| 116359 | Jason  | Watson | 0      | 
| 10637  | Brandon | Wilson | 10      | 
| 105197 | Mike  | Jones | 0      | 
+------------+------------+----------+-------------------------+ 

Вот запрос я работал, но он не работает:

SELECT CoinAwards.EmployeeID, CoinAwards.AwardDate, CoinAwards.CoinLevel, 
    SUM(CoinLevels.Value) AS Sum_Of_2015_Coin_Values, 
    Employees.FirstName, Employees.Lastname 
FROM CoinAwards 
LEFT OUTER JOIN 
    CoinLevels ON CoinAwards.CoinLevel = CoinLevels.ID 
LEFT OUTER JOIN 
    Employees ON Employees.EmployeeID = CoinAwards.EmployeeID 
WHERE (CoinAwards.AwardDate BETWEEN '01/01/2015' AND '12/31/2015') 
GROUP BY CoinAwards.EmployeeID 

Каждый знает, как я могу изменить этот запрос чтобы получить результат, который я ищу? Спасибо за любую помощь!

+1

Что значит "не работает" означает? Вы получаете сообщение об ошибке? –

+0

Возьмите CoinAwards.AwardDate, CoinAwards.CoinLevel, из вашего SELECT - вы говорите, что не хотите их! GROUP BY – Cato

+0

Спасибо вам обоим. Да, я получал ошибку и не понимал, что мне нужно использовать агрегатные функции в столбцах или оставить их – Cineno28

ответ

6
Select E.EmployeeID 
     ,E.FirstName 
     ,E.LastName 
     ,Sum_Of_2015_Coin_Values = isnull(sum(L.Value),0) 
From Employees E 
Left Join CoinAwards C on (E.EmployeeID = C.EmployeeID and Year(C.AwardDate)=2015 ) 
Left Join CoinLevels L on (C.CoinLevel = L.ID) 
Group By 
     E.EmployeeID 
     ,E.FirstName 
     ,E.LastName 
+0

Это элегантно. Это сработало? – Missy

+0

@John Cappelletti Это сработало красиво!спасибо – Cineno28

0

Удалить CoinAwards.AwardDate, CoinAwards.CoinLevel из списка SELECT.

Добавить Employees.FirstName, Employees.Lastname в вашу группу.

0

Вам нужно либо использовать aggregate function на других колонках, а также:

SELECT CoinAwards.EmployeeID, MAX(CoinAwards.AwardDate), MAX(CoinAwards.CoinLevel), 
    SUM(CoinLevels.Value) AS Sum_Of_2015_Coin_Values, 
    MAX(Employees.FirstName), MAX(Employees.Lastname) 
FROM CoinAwards 
LEFT OUTER JOIN 
    CoinLevels ON CoinAwards.CoinLevel = CoinLevels.ID 
LEFT OUTER JOIN 
    Employees ON Employees.EmployeeID = CoinAwards.EmployeeID 
WHERE (CoinAwards.AwardDate BETWEEN '01/01/2015' AND '12/31/2015') 
GROUP BY CoinAwards.EmployeeID 

или оставить их:

SELECT CoinAwards.EmployeeID, 
    SUM(CoinLevels.Value) AS Sum_Of_2015_Coin_Values 
FROM CoinAwards 
LEFT OUTER JOIN 
    CoinLevels ON CoinAwards.CoinLevel = CoinLevels.ID 
LEFT OUTER JOIN 
    Employees ON Employees.EmployeeID = CoinAwards.EmployeeID 
WHERE (CoinAwards.AwardDate BETWEEN '01/01/2015' AND '12/31/2015') 
GROUP BY CoinAwards.EmployeeID 

ИЛИ группу ими, а также:

SELECT CoinAwards.EmployeeID, CoinAwards.AwardDate, CoinAwards.CoinLevel, 
    SUM(CoinLevels.Value) AS Sum_Of_2015_Coin_Values, 
    Employees.FirstName, Employees.Lastname 
FROM CoinAwards 
LEFT OUTER JOIN 
    CoinLevels ON CoinAwards.CoinLevel = CoinLevels.ID 
LEFT OUTER JOIN 
    Employees ON Employees.EmployeeID = CoinAwards.EmployeeID 
WHERE (CoinAwards.AwardDate BETWEEN '01/01/2015' AND '12/31/2015') 
GROUP BY CoinAwards.EmployeeID, CoinAwards.AwardDate, CoinAwards.CoinLevel, Employees.FirstName, Employees.Lastname 

Ошибка может быть следующей:

Столбец «dbo.YourTable.col2» недействителен в списке выбора, потому что он не содержится ни в агрегатной функции, ни в предложении GROUP BY.

Надеюсь, это вам поможет.

+0

Очень полезно, спасибо! Я новичок в использовании агрегатных функций и был смущен этим – Cineno28

0

попробовать что-то вроде

SELECT Employees.EmployeeID, Employees.FirstName, Employees.Lastname 
SUM(COALESCE(CoinLevels.Value,0)) AS Sum_Of_2015_Coin_Values 

FROM CoinAwards 
LEFT OUTER JOIN 
    CoinLevels ON CoinAwards.CoinLevel = CoinLevels.ID 
LEFT OUTER JOIN 
Employees ON Employees.EmployeeID = CoinAwards.EmployeeID 
WHERE (CoinAwards.AwardDate BETWEEN '01/01/2015' AND '12/31/2015') 
GROUP BY Employees.EmployeeID, Employees.FirstName, Employees.Lastname 
0

Вы можете использовать это, а также:

SELECT Employees.EmployeeID, 
    Employees.FirstName, 
    Employees.Lastname, 
    ISNULL(SUM(CoinLevels.Value), 0) AS Sum_Of_2015_Coin_Values 
FROM CoinAwards 
LEFT JOIN CoinLevels ON CoinAwards.CoinLevel = CoinLevels.ID 
LEFT JOIN Employees ON Employees.EmployeeID = CoinAwards.EmployeeID 
WHERE CoinAwards.AwardDate BETWEEN '01/01/2015' AND '12/31/2015' 
GROUP BY Employees.EmployeeID, Employees.FirstName, Employees.Lastname 
0

, с КТР в ( выберите EmployeeID, сумма (стоимость) coin_value из CoinAwards ca join CoinLevels cl on cl.id = ca.coinlevel где год (конвертировать (дата, награда) ATE, 107)) = 2015 группы по EmployeeID ) выберите EmployeeID, ПгвЬЫат, ФАМИЛИЯ, coin_value из CTE с присоединиться к сотрудникам е на c.employeeid = e.employeeid

Смежные вопросы