Как преобразовать nvarchar в числовой

У меня есть поля с десятичными значениями, но импортированные в базу данных как тип данных nvarchar(50), которые выглядят так:

Время (продажа заказанного товара) (Заказаны единицы) 2022-01-01T00:00:00 $55,60 4 2022-01-03T00:00:00 652,54 доллара США 13

Цель: я хотел агрегировать (СУММ) эти поля, чтобы получить сумму заказов и общее количество заказанных единиц.

Я попытался представить эти значения как numeric(10,2), потому что хотел агрегировать эти поля (СУММ):

SELECT 
    [Time],
    SUM(CAST([Ordered_product_sales] AS NUMERIC(10, 2))) AS Sales_per_day,
    SUM(CAST([Units_ordered] AS INT)) AS num_of_units_ordered
FROM 
    [dbo].[salesDashboard]
WHERE      
    Ordered_product_sales <> '0.00' 
    AND Ordered_product_sales IS NOT NULL
GROUP BY 
    Time

Однако я получаю следующую ошибку:

Ошибка преобразования типа данных nvarchar в числовой.

Используйте try_convert(money,[Ordered_product_sales])... это, как правило, более щадящее. Например: выберите try_convert(money,'55,60$')

John Cappelletti 06.01.2023 00:25

Или replace(MyColumn,'$','') сначала

Dale K 06.01.2023 00:26

Конечно, реальное решение — исправить свой дизайн, а не хранить числовые данные в виде nvarchar.

Larnu 06.01.2023 00:28

@Larnu В базе данных несколько миллионов строк, и данные не очищены, числовые поля должны быть обозначены как nvarchar, поскольку только в одном поле есть несколько типов данных.

MarsRoboters 06.01.2023 02:38

числовые поля должны идти как nvarchar, так как только в одном поле есть несколько типов данных - и это, конечно, еще один ужасно плохой дизайн ... исправьте это, вместо того, чтобы тратить свое время на применение исправлений и пластырей ко всем вашим запросам!

marc_s 06.01.2023 06:17

Это определенно звучит так, как будто вы не рассказываете нам всю историю и что, как уже упоминалось, у вас есть некоторые очень фундаментальные проблемы дизайна, которые вам нужно решить.

Larnu 06.01.2023 10:02

DaleK указывает на непосредственную причину вашей ошибки: символ «$» не может быть преобразован в числовое значение и должен быть удален из строки перед CAST. Ларну и marc_s также правы, критически оценивая дизайн таблицы и столбцов.

paneerakbari 06.01.2023 16:24
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
7
93
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Проблема, вызывающая вашу ошибку, заключается в том, что строки данных в столбце [Ordered_product_sales] содержат символ, который нельзя преобразовать в тип данных numeric. Прежде чем выполнять функцию $, вы должны сначала дезинфицировать строки, чтобы удалить все символы, которые не могут быть преобразованы, в частности CAST, присутствующие в ваших данных образца.

Это должно работать:

SELECT 
    [Time]
    ,SUM(CAST(REPLACE([Ordered_product_sales], '$', '') AS NUMERIC(10, 2))) 
     AS Sales_per_day,
    ,SUM(CAST([Units_ordered] AS INT)) AS num_of_units_ordered
FROM [dbo].[salesDashboard]

И вам следует подумать и приложить усилия для улучшения дизайна вашей таблицы и столбцов в отношении типов данных.

Другие вопросы по теме