按存储过程分组

时间:2013-07-29 12:26:59

标签: sql sql-server sql-server-2008

我有项目和成员的表格,主要目标是一对多关系。

我有很多项目和很多成员,现在我必须找到在特定项目中分配了多少成员(除了这些之外我还有很多表,我在这里没有提到,但你可以在我的存储过程中看到)

CREATE PROCEDURE [dbo].[SP_PROJECT_EMPLOYSSSS]
(
  @Employee_ID INT
)
AS
BEGIN
    SELECT E.Employee_ID, S.Project_Title, COUNT(E.First_Name) 
    FROM tbl_NEW_Employee AS E  
    INNER JOIN  tbl_NEW_Employee_Project AS K ON K.Employee_ID = E.Employee_ID 
    INNER JOIN dbo.tbl_NEW_Project AS S ON K.Project_ID = S.Project_ID 
    WHERE E.Is_Active=1 AND E.Employee_ID = @Employee_ID 
    Group BY E.First_Name
END

我是编程和存储过程的新手。

我收到此错误:

  

列'tbl_NEW_Employee.Employee_ID'在选择列表中无效   因为它不包含在聚合函数或   GROUP BY子句。

请帮我用GROUP BY子句

编写这个存储过程

2 个答案:

答案 0 :(得分:2)

在sql查询中使用group by子句时,只有那些列可以放在select列列表中的group by列列表中。

在上面的查询中,您只有group by列列表中的First_name,但您正试图在E.Employee_ID,S.Project_Title列列表中获取select

如果您想要选择列中的所有上述字段,请在group by子句中添加它们。

SELECT E.Employee_ID,S.Project_Title,COUNT(E.First_Name) 
    FROM tbl_NEW_Employee AS E  
    INNER JOIN  tbl_NEW_Employee_Project AS K ON K.Employee_ID=E.Employee_ID 
    INNER JOIN dbo.tbl_NEW_Project AS S ON K.Project_ID=S.Project_ID 
    WHERE E.Is_Active=1 AND E.Employee_ID=@Employee_ID 
    Group BY E.Employee_ID,S.Project_Title

否则将其从选择列表中删除

SELECT COUNT(E.First_Name) ,E.First_Name
        FROM tbl_NEW_Employee AS E  
        INNER JOIN  tbl_NEW_Employee_Project AS K ON K.Employee_ID=E.Employee_ID 
        INNER JOIN dbo.tbl_NEW_Project AS S ON K.Project_ID=S.Project_ID 
        WHERE E.Is_Active=1 AND E.Employee_ID=@Employee_ID 
        Group BY E.Employee_ID,S.Project_Title

答案 1 :(得分:0)

似乎是SQL Server而不是MySQL

您必须GROUP BY要聚合的列(即每个值只输出一行):

SELECT E.Employee_ID,S.Project_Title,COUNT(E.First_Name) 
FROM tbl_NEW_Employee AS E  
INNER JOIN  tbl_NEW_Employee_Project AS K ON K.Employee_ID=E.Employee_ID 
INNER JOIN dbo.tbl_NEW_Project AS S ON K.Project_ID=S.Project_ID 
WHERE E.Is_Active=1 AND E.Employee_ID=@Employee_ID 
Group BY E.Employee_ID,S.Project_Title