我正在尝试使用Datepart
和SUM
请参阅全部设置的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
答案 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
而不是转换类型错误。