我正在寻找对表中声明为varchar(50)
的字段求和,Emp_Data开始日期和结束日期之间,并按Emp_ID分组。
Emp_Data架构
Emp_ID as varchar(50),
Emp_Name as varchar(50),
Processing_Date as datetime,
PR as varchar(50),
Lines as varchar(50),
Followup as varchar(50)
Employee_Details架构
emp_id as varchar(50),
Emp_Name as varchar(50),
Manager as varchar(50),
Target as int.
我尝试了一个查询:
SELECT PS.emp_id,
PS.emp_Name,
Sum(PR_Validation),
Sum(Lines),
Sum(RC_Number),
Sum(Followup),
Sum(Manual_Order),
Sum(Quotes_Processed)
FROM Emp_Data AS PS
INNER JOIN tbl_Employee_Details AS ED
ON ED.manager = 'Viswanathan'
AND PS.processing_date BETWEEN '01/01/2017' AND '01/31/2017'
GROUP BY PS.emp_Id
但是我收到错误
"列'Emp_Data.Emp_Name'在选择列表中无效,因为它 不包含在聚合函数或 GROUP BY 中 第。
我是 SQL Server 的新手。
我认为您正在使用SQL Server。 如果是这样,最好的方法是将您的数字存储为数字。 这就是为什么SQL具有多个内置数据类型的原因。 它们用于不同的事情。
但是,如果您坚持使用字符串,请起诉try_convert()
. 我不知道实际类型,所以我只输入整数:
SELECT PS.emp_id, PS.emp_Name,
Sum(try_convert(int, PR_Validation)),
Sum(try_convert(int, Lines)),
Sumtry_convert(int, (RC_Number)),
Sum(try_convert(int, Followup)),
Sum(try_convert(int, Manual_Order)),
Sum(try_convert(int, Quotes_Processed))
FROM Emp_Data PS INNER JOIN
tbl_Employee_Details AS ED
ON ED.manager = 'Viswanathan' AND
PS.processing_date >= '2017-01-01' AND
PS.processing_date < '2018-01-01'
GROUP BY PS.emp_Id, PS.emp_Name ;
有关我为什么将BETWEEN
改为不平等的讨论,请阅读Aaron Bertrand关于该主题的博客。 (请注意,这适用于 SQL Server 以外的数据库。 我还认为您应该始终使用 ISO 标准日期格式,YYYYMMDD(最好在 SQL Server 中使用)或 YYYY-MM-DD(几乎一样好,适用于其他数据库,并且更易于阅读)。
也有可能您打算COUNT()
而不是SUM()
。 在这种情况下,不需要转换。