У меня есть поля с десятичными значениями, но импортированные в базу данных как тип данных nvarchar(50), которые выглядят так:
Цель: я хотел агрегировать (СУММ) эти поля, чтобы получить сумму заказов и общее количество заказанных единиц.
Я попытался представить эти значения как 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 в числовой.
Или replace(MyColumn,'$','') сначала
Конечно, реальное решение — исправить свой дизайн, а не хранить числовые данные в виде nvarchar.
@Larnu В базе данных несколько миллионов строк, и данные не очищены, числовые поля должны быть обозначены как nvarchar, поскольку только в одном поле есть несколько типов данных.
числовые поля должны идти как nvarchar, так как только в одном поле есть несколько типов данных - и это, конечно, еще один ужасно плохой дизайн ... исправьте это, вместо того, чтобы тратить свое время на применение исправлений и пластырей ко всем вашим запросам!
Это определенно звучит так, как будто вы не рассказываете нам всю историю и что, как уже упоминалось, у вас есть некоторые очень фундаментальные проблемы дизайна, которые вам нужно решить.
DaleK указывает на непосредственную причину вашей ошибки: символ «$» не может быть преобразован в числовое значение и должен быть удален из строки перед CAST. Ларну и marc_s также правы, критически оценивая дизайн таблицы и столбцов.





Проблема, вызывающая вашу ошибку, заключается в том, что строки данных в столбце [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]
И вам следует подумать и приложить усилия для улучшения дизайна вашей таблицы и столбцов в отношении типов данных.
Используйте try_convert(money,[Ordered_product_sales])... это, как правило, более щадящее. Например: выберите try_convert(money,'55,60$')