2014-11-24 3 views
1

Я должен написать запрос для вычисления суммы столбца, где код причины как число. Поэтому у меня есть эта таблицаКак группа по запросу по семейному коду

TableX:

 
------------------------ 
| ReasoneCode | Duration | 
|------------------------| 
| 201   | 27512 | 
| 202   | 4372  | 
| 100   | 10322 | 
| 301.12  | 1  | 
| 302.06  | 34  | 
| 305   | 12  | 
------------------------ 

Теперь я хочу результат, как этот:

 
------------------------ 
| ReasoneCode | Duration | 
|------------------------| 
| 200   | 31884 | 
| 100   | 10322 | 
| 300   | 47  | 
------------------------ 

Поэтому я стараюсь, чтобы написать этот запрос, но не нашел правильно

SELECT ReasonCode, SUM(Duration) 
FROM TableX  
GROUP BY ReasonCode 

Вы можете мне помочь?


Я стараюсь использовать это решение. С помощью этого запроса я удаляю все '.' из первой колонки

SELECT CAST(LEFT(replace(ReasonCode, '.', ''), (CHARINDEX('.', replace(ReasonCode, '.', ''), 1) + 4)) AS DECIMAL(14, 0)) as Data, SUM(Duration) 
FROM TableX 
GROUP BY CAST(LEFT(replace(ReasonCode, '.', ''), (CHARINDEX('.', replace(ReasonCode, '.', ''), 1) + 4)) AS DECIMAL(14, 0)) 

Сейчас я пытаюсь написать другой запрос для группы по результату из reasoneCode семьи. Результат этого запроса:

------------------------ 
| ReasoneCode | Duration | 
|------------------------| 
| 201   | 27512 | 
| 202   | 4372  | 
| 100   | 10322 | 
| 30112  | 1  | 
| 30206  | 34  | 
| 305   | 12  | 
------------------------ 

я мог бы поставить этот результат во временную таблицу, а затем выбрать из этой временной таблицы

SELECT 
    CAST(CAST(ReasonCode as decimal(8,2)) as int)/100 * 100 as roundedCode, 
    SUM(Duration) 
FROM @TemporaryTable  
GROUP BY CAST(CAST(ReasonCode as decimal(8,2)) as int)/100 * 100 

Теперь результат:

 ------------------------ 
    | ReasoneCode | Duration | 
    |------------------------| 
    | 200   | 31884 | 
    | 100   | 10322 | 
    | 3000  | 35  | 
    | 305   | 12  | 
    ------------------------ 

Существует только одна ошибка, она не группируется на 300 и 3000.

+4

После 30 сообщений, пожалуйста, научитесь правильно отформатировать свои вопросы. –

+0

Что вы подразумеваете под 'like a number'? Какой тип 'ReasoneCode'? –

+0

Столбец ReasoneCode представляет собой столбец NVARCHAR, но содержит значение как 301,302,301.12,301.13 ... – bircastri

ответ

0
SELECT cast(ReasonCode as int)/100 * 100 as roundedCode, SUM(Duration) 
FROM TableX  
GROUP BY roundedCode 
+0

Спасибо, но есть столбец со значением 302.12 или 303.06, тогда ваш запрос не найден – bircastri

+0

Затем введите значение в 'int', как и в моем обновленном ответе –

0

Предполагая, что вы хотите группировать по кратным сотням, и оба столбца являются числовыми, вот как это можно сделать.

ВЫБОР круглая (круглая (ReasonCode)/100) * 100, как roundedCode, СУММА (продолжительность) ОТ TableX
ГРУППА ПО roundedCode

+0

Спасибо, но есть столбец со значением 302.12 или 303.06, тогда ваш запрос не найден – bircastri

+0

Хорошо. Я предположил столбец Reasoncode как целое число.Я отредактировал ответ на работу для десятичной дроби. попробуйте обновить запрос. –

0

Попробуйте это:

SELECT 
    CAST(CAST(ReasonCode as decimal(15,5)) as int)/100 * 100 as roundedCode, 
    SUM(Duration) 
FROM TableX  
GROUP BY roundedCode 
0

Тест

Если ReasonCode является ЧИСЛЕННЫМ типом данных

SELECT (ReasonCode-(ReasonCode%100)), SUM(Duration) 
FROM #Table  
GROUP BY (ReasonCode-(ReasonCode%100)) 

Если ReasonCode является NVARCHAR

SELECT (CONVERT(NUMERIC(22,6),ReasonCode)-(CONVERT(NUMERIC(22,6),ReasonCode)%100)), SUM(Duration) 
FROM #Table  
GROUP BY (CONVERT(NUMERIC(22,6),ReasonCode)-(CONVERT(NUMERIC(22,6),ReasonCode)%100)) 
Смежные вопросы