在查询中使用datepart

时间:2016-04-05 22:29:04

标签: sql-server datetime

我正在尝试使用DatepartSUM

获取以下格式的选择查询

请参阅全部设置的Link to SQL Fiddle

我正在尝试在Datepart中使用Group by,但它一直出错。

| Material | TaskList | Weeknum | Sum of Signoff Qty |
------------------------------------------------------
|  xx      |    aa    |   11    |     8              |
|  xx      |    bb    |   11    |     7              |
|  xx      |    aa    |   12    |     8              |
|  xx      |    bb    |   12    |     7              |
|  yy      |    aa    |   11    |     22             |
|  yy      |    bb    |   11    |     20             |
|  yy      |    aa    |   12    |     22             |
|  yy      |    bb    |   12    |     20             |

生成测试数据:

CREATE TABLE tangoTable 
    (
     [Task List] varchar(50), 
     [DateandTime] varchar(50), 
     [SignoffQty] varchar(30),
     [Material] varchar(50)
    );

INSERT INTO tangoTable
([Task List]
 , [DateandTime]
 , [SignoffQty]
 , [Material])
VALUES
('aa', '3/14/16 21:41', '4', 'xx'),
('aa', '3/16/16 11:41', '4', 'xx'),
('bb', '3/18/16 20:00', '3', 'xx'),
('bb', '3/19/16 10:00', '4', 'xx'),
('aa', '3/14/16 10:00', '10', 'yy'),
('aa', '3/16/16 10:00', '12', 'yy'),
('bb', '3/18/16 11:41', '9', 'yy'),
('bb', '3/19/16 11:41', '11', 'yy'),
('aa', '3/07/16 21:41', '4', 'xx'),
('aa', '3/07/16 11:41', '4', 'xx'),
('bb', '3/07/16 20:00', '3', 'xx'),
('bb', '3/07/16 10:00', '4', 'xx'),
('aa', '3/07/16 10:00', '10', 'yy'),
('aa', '3/07/16 10:00', '12', 'yy'),
('bb', '3/07/16 11:41', '9', 'yy'),
('bb', '3/07/16 11:41', '11', 'yy')
;

查询尝试:

Select 
[Material]
,[Task List]
,Datepart(wk, [DateandTime]) as WeekNum
,Sum(Cast(SignoffQty as Int)) as 'Sum of Signoff'
from tangoTable
Group By
[Material], [Task List], WeekNum

1 个答案:

答案 0 :(得分:1)

您需要使用date_part(wk, dateandtime)来获取一年的周数。

您需要将signoffqty值转换为int数据类型才能sum

SELECT
  material, 
  [Task List], 
  datepart(wk, dateandtime) AS weeknum, 
  sum(cast(signoffqty as int)) as sum_of_signoff_qty
FROM
  tangotable
GROUP BY
  material, [Task List], datepart(wk, dateandtime)

我认为varchar(30)列的[SignoffQty]非常合适。它应该是一些数字数据类型。

如果您碰巧有非数字字符,那么您的查询将返回错误

  

转换varchar值时转换失败' value_here'到数据类型   中间体

正确地说明 @Used_By_Already

SQL Server 2012 开始,您可以使用TRY_CAST()函数代替CAST()

  

如果转换成功,则返回强制转换为指定数据类型的值;   否则,返回null。

请注意行为会改变。对于具有material, [Task list], weeknum列中值的给定signoffqty对,如:

5
3x -- varchar!
8

总和将返回:13而不是转换类型错误。