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

时间:2017-01-29 15:21:38

标签: sql sql-server

我希望在开始日期和结束日期之间对表中声明为varchar(50)的字段, Emp_Data 进行求和,并将其分组为 Emp_ID 。< / p>

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 

但是我收到了错误

  

&#34;专栏&#39; Emp_Data.Emp_Name&#39;因为它在选择列表中无效   不包含在聚合函数或GROUP BY中   子句。

我是SQL Server新手。

1 个答案:

答案 0 :(得分:0)

我认为您正在使用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的blog on the subject。 (请注意,这适用于SQL Server以外的数据库。)我还认为您应该始终使用ISO标准日期格式,YYYYMMDD(在SQL Server中最好使用)或YYYY-MM-DD(几乎与好的,适用于其他数据库,更具人性化。)

您也可能打算COUNT()而不是SUM()。在这种情况下,转换不是必需的。