SQL,在联接表上查找和

SQL,在联接表上查找和,sql,sql-server,Sql,Sql Server,我有3个表,我正试图加入,并得到一列的总和。我很难为它提出一个有效的查询。这是桌子 CoinAwards +----+------------+------------+-----------+ | ID | EmployeeID | AwardDate | CoinLevel | +----+------------+------------+-----------+ | 1 | 116733 | 6/11/2015 | 1 | | 2 | 116359

我有3个表,我正试图加入,并得到一列的总和。我很难为它提出一个有效的查询。这是桌子

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
有人知道如何更改此查询以获得我要查找的结果吗?谢谢你的帮助

从您的选择列表中删除CoinAwards.AwardDate、CoinAwards.CoinLevel

将Employees.FirstName、Employees.Lastname添加到您的组中。

您还需要在其他列上使用a:

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 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
或者将它们排除在外:

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子句中

我希望这对你有帮助。

试试类似的方法

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

您也可以使用此选项:

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 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
);以cte为例 选择employeeid、sumvalue和U值 从…起 科因卡 在cl.id=ca.coinlevel上连接coinlevel cl 其中yearconvertdate,AwardDate,107=2015 按雇员ID分组 从cte c中选择employeeid、firstname、lastname、coin_值
在c.employeeid=e.employeeid上加入员工e

什么是不工作?您是否遇到错误?将CoinAwards.AwardDate、CoinAwards.CoinLevel从您的选择中删除-您是在说您不想要它们!分组谢谢你们。是的,我遇到了一个错误,我不知道我需要在列上使用聚合函数,或者不使用聚合函数out@John卡佩莱蒂:这真是太棒了!谢谢你非常有帮助,谢谢你!我不熟悉使用聚合函数,对此感到困惑