如何在开始日期和结束日期之间对表中的 varchar 字段求和



我正在寻找对表中声明为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()。 在这种情况下,不需要转换。

最新更新