Как я могу использовать Sum для строковой функции? - PullRequest
0 голосов
/ 01 октября 2019

Сотрудник имеет несколько часов контракта, я хочу суммировать общее количество часов контракта для каждого сотрудника, но данные в столбце общих часов контракта имеют следующий формат: 35.00 - часы контракта При попытке запустить скрипт ниже:

SELECT DISTINCT
   EmpId
  ,Substring(Contract_Hours,1,5) AS TotalContractHours
  ,SUM(CAST(Substring(Contract_Hours,1,5) AS INT))
  --OR ,SUM(CAST(Substring(Contract_Hours,1,5) AS  decimal(1,1)))

FROM tbl.Employee

GROUP BY 
  EmpID
 ,Substring(Contract_Hours,1,5)

Я получаю ошибку:

Сообщение 245, Уровень 16, Состояние 1, Строка 1

Преобразование не удалось при преобразовании значения varchar '28 .00'к типу данных int.

Я пытался запустить его без агрегата суммы, и он работал, так что я думаю, что это как-то связано с суммой и типом данных, который не преобразует

Что я делаю неправильно? Пожалуйста, помогите

Ответы [ 4 ]

0 голосов
/ 01 октября 2019

Если вы действительно застряли с этим ужасным замыслом, то я бы попытался завершить ваш запрос, чтобы сделать его максимально безопасным, например:

SELECT
    EmpId,
    LEFT(Contract_Hours, 5) AS TotalContractHours,
    SUM(CONVERT(INT, CASE WHEN ISNUMERIC(LEFT(Contract_Hours, 5)) = 1 THEN CONVERT(NUMERIC(19,2), LEFT(Contract_Hours, 5)) ELSE 0 END)) AS SummedHours
FROM 
    tbl.Employee
GROUP BY 
    EmpID,
    LEFT(Contract_Hours, 5);

Как это работает?

Нам не нужно беспокоиться о SUBSTRING, так как вы всегда начинаете с крайней левой позиции строки, поэтому LEFT проще. ISNUMERIC сообщит нам, получим ли мы число или нет, чтобы мы не получали исключение, пытаясь CONVERT что-то из строки в число. Таким образом, если самые левые 5 символов являются числовыми, мы CONVERT переводим их в десятичные дроби 2dp, затем в INT, затем SUM их.

0 голосов
/ 01 октября 2019

Ошибка в подстроке. Подстрока (1,2) будет работать

enter image description here

Но (1,5) не будет. Скорее всего из-за десятичной дроби. Возможно, вам придется выполнить двойное преобразование / приведение к десятичному знаку, а затем вернуться к целому числу

enter image description here

Как это:

SELECT DISTINCT
   EmpId
  ,Substring(Contract_Hours,1,5) AS TotalContractHours
  ,SUM(Convert(int,CAST(Substring(Contract_Hours,1,5) AS decimal(18,2))))
  --OR ,SUM(CAST(Substring(Contract_Hours,1,5) AS  decimal(1,1)))

FROM tbl.Employee

GROUP BY 
  EmpID
 ,Substring(Contract_Hours,1,5)
0 голосов
/ 01 октября 2019

Вы можете попробовать сначала превратить значение в числовое значение. Впоследствии конвертируйте его в десятичное . Со следующим кодом это должно работать.

SUM(CAST(CAST(Contract_Hours AS decimal(10,2)) AS int))

Andrea Veglia

0 голосов
/ 01 октября 2019

Поскольку часы представлены в формате xx.yy, у вас есть 2 варианта:

1. Возьмите только целую часть и приведите к типу int:

SELECT EmpId
  ,Substring(Contract_Hours,1,2) AS TotalContractHours
  ,SUM(CAST(Substring(Contract_Hours,1,2) AS INT))
FROM tbl.Employee
GROUP BY 
  EmpID
 ,Substring(Contract_Hours,1,2)

2. Возьмите целую часть и приведите к десятичной дроби:

 SELECT EmpId
      ,Substring(Contract_Hours,1,5) AS TotalContractHours
      ,SUM(CAST(Substring(Contract_Hours,1,5) AS DECIMAL(18,2)))
    FROM tbl.Employee
    GROUP BY 
      EmpID
     ,Substring(Contract_Hours,1,5)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...