2016-04-05 3 views
2

Я пытаюсь получить запрос на выборку, который следующий формат с использованием Datepart и SUMИспользование DATEPART в запросе с группой по

Пожалуйста, смотрите 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

Благодарим вас Подумать обо мне - я должен был добавить это. Также я не уверен, почему попытка запроса не отображается. Возможно, URL-адрес неверен. Я также добавил попытку запроса на вопрос. – TangoAlee

+0

При использовании SQL Fiddle вам нужно нажать кнопку «Сборка схемы», затем нажмите «Запустить SQL-кнопку» и «__after__» эти действия скопируют ссылку на страницу. Это изменится. Вероятно, вы скопировали свою ссылку, не выполнив инструкцию SQL. Я отредактировал вашу ссылку. –

ответ

1

Вы должны использовать date_part(wk, dateandtime), чтобы получить номер недели в году.

Вам необходимо направить свое значение signoffqty в int для datatype, чтобы иметь возможность 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» для типа данных Int.


Как @Used_By_Already правильно сказал:

Начиная с SQL Server 2012 можно использовать TRY_CAST() функцию вместо CAST() которых:

Возвращает значение ввергнуть к указанный тип данных, если преемственность выполнена; в противном случае, возвращает null.

Опасайтесь, чтобы поведение изменилось. Для данной пары material, [Task list], weeknum со значениями в колонке signoffqty как:

5 
3x -- varchar! 
8 

сумма вернется: 13 вместо ошибки типа преобразования.

+0

Вау - такой простой ответ - я был так близок. Большое спасибо! – TangoAlee

+0

И спасибо за примечание о 'Cast' - я бы хотел изменить схему таблицы, но она заблокирована, единственное, что я действительно могу сделать, это выбрать запрос. Еще раз спасибо! – TangoAlee

+0

Иногда мы застряли, за что мы застряли. Это подразумевает плохой дизайн, хотя и может разорвать ваш запрос на числовые значения, просто голова! Удачи. –

Смежные вопросы