Goran Bibic Ответов: 3

Задача о тысяче десятичных знаков


My code is ok, but if have values from 0 to 999 its ok
 
Exmpl two values 500.00 and 80.00 result is 580.00
That is ok
 
Exmp if have two values   1,000.00 and 100.00 result is 100.00
 
Some help?


Что я уже пробовал:

select kupac as 'Kupac',
SUM(TRY_CONVERT(Decimal(10, 2), ISNULL(NULLIF(iznos_sa_pdv, ''), '0'))) AS 'UKUPNO'   
from(select kupac, iznos_sa_pdv from mp_faktura_lista union all select kupac, iznos_sa_pdv from mp_racun_lista) as alltables  
group by kupac  

Richard MacCutchan

Почему вы храните числа как типы символов?

Goran Bibic

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

Richard MacCutchan

Способ ее решения - использовать правильные числовые типы. Время, которое вы тратите, пытаясь обойти чью-то глупость, обычно тратится впустую. Прикусите пулю прямо сейчас и исправьте базу данных.

Goran Bibic

Я знаю. Есть наполовину готовый раствор. Надо починить. Чтобы добавить новый столбец с типом numeric в таблицу sql? И visual studio...и так далее...Так ведь?

3 Ответов

Рейтинг:
2

Wendelius

Насколько я понимаю, вы храните числа в строковом столбце базы данных. В операции SUM вы в конечном итоге сталкиваетесь с проблемами из-за тысячи разделителей.

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


OriginalGriff

Вы, вероятно, правы - но без его фактических данных трудно сказать ... :вздыхать:

Goran Bibic

тип данных-varchar (255)

Wendelius

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

Рейтинг:
1

Serg9n

Если вы не можете изменить дизайн БД по какой-то причине, вам нужно просто исключить ',' из строкового представления числовых значений

SUM(TRY_CONVERT(Decimal(10, 2), ISNULL(NULLIF(REPLACE(iznos_sa_pdv,',','' )''), '0')))

В настоящее время TRY_CONVERT() возвращает NULL для непокрытой строки, а SUM() игнорирует null, поэтому
значения типа "1500" игнорируются.


Рейтинг:
1

OriginalGriff

Я бы начал с проверки самих данных вашей БД - у нас нет к ним доступа, но я бы заподозрил, что iznos_sa_pdv содержит некоторые пустые строки.

Попробуйте его в SSMS, и когда он даст "неправильный" результат, начните немного разбивать его, чтобы точно выяснить, что он обрабатывает в качестве данных.


Goran Bibic

Не понял моего вопроса.
Значение равно null sql write 0 это нормально
Значение равно 500.00 sql write 500.00 its ok

Проблема заключается в том , когда есть значения больше, чем 999 с разделителем, 1,456.00

Когда сумма в sql 500.00+1,456.00 результат равен 500.00
Сепаратор , это проблема

Какая-то помощь?

OriginalGriff

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

Goran Bibic

Спасибо. С уважением