SQL,在联接表上查找和
我有3个表,我正试图加入,并得到一列的总和。我很难为它提出一个有效的查询。这是桌子SQL,在联接表上查找和,sql,sql-server,Sql,Sql Server,我有3个表,我正试图加入,并得到一列的总和。我很难为它提出一个有效的查询。这是桌子 CoinAwards +----+------------+------------+-----------+ | ID | EmployeeID | AwardDate | CoinLevel | +----+------------+------------+-----------+ | 1 | 116733 | 6/11/2015 | 1 | | 2 | 116359
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卡佩莱蒂:这真是太棒了!谢谢你非常有帮助,谢谢你!我不熟悉使用聚合函数,对此感到困惑