От деца ни учат да закръгляваме числата. Когато закръглите 1,15 до най-близките десети, ще бъде ли 1,2 или 1,1? Използването на функцията SQL ROUND за отговор може да ви обърка. По-късно ще видите какво имам предвид.
[sendpulse-form id=”12010″]
Ето още един въпрос. Каква е сумата от 1 + 1? Това е доста глупав въпрос. Това е за деца, които учат математика за първи път, а не за нас, възрастните. Но моля, вижте кода по-долу:
-- Variables for input values
DECLARE @value1 DECIMAL(3,2) = 1.05
DECLARE @value2 DECIMAL(3,2) = 1.45
DECLARE @sum1 DECIMAL(3,2) = @value1 + @value2
-- Variables for rounded values
DECLARE @roundedValue1 TINYINT = ROUND(@value1,0)
DECLARE @roundedvalue2 TINYINT = ROUND(@value2,0)
DECLARE @sum2 TINYINT = ROUND(@sum1,0)
-- Surprise!
SELECT 'sum of ' + CAST(@value1 AS VARCHAR(4)) + ' + ' + CAST(@value2 AS VARCHAR(4)) AS Q1, @sum1 AS Sum1
SELECT 'sum of ' + CAST(@roundedValue1 AS VARCHAR(4)) + ' + ' + CAST(@roundedValue2 AS VARCHAR(4)) AS Q2, @sum2 AS Sum2
След това проверете резултатите по-долу:
Какво се е случило тук? Получаваме две стойности с десетична част. След това ги закръгляме с помощта на SQL ROUND до най-близкото цяло число. Техните суми също са закръглени. Но как може 1 + 1 да бъде 3?!
Остър SQL професионалист ще забележи проблема в кода веднага. Но помислете за това:
- Закръгляването на 2,5 до най-близкото цяло число е 3, а не 2.
- Сборът от 1 + 1 е 2.
Трудно е, нали?
Тук е смисълът. Ако не внимавате, SQL ROUND може да ви побърка. Това също може да бъде източник на спорове между разработчици и счетоводители. Един от тях е, когато се работи с принципа на материалността. Аргументите могат да станат грозни.
Какво можете да направите?
Кръгла функция в SQL Server
Не, не ви казвам да предавате този проблем на следващия разработчик. Тази публикация ще ви даде типични съвети, за да направите и вас, и вашия потребител доволни от резултата. Някои от тези съвети могат да се прилагат и за закръгляване на число от предната страна на приложението или в отчети.
Нека проверим подробно нашите 5 съвета.
Функция закръгляване за числа в SQL
Вече знаете как да закръглите числата в SQL, така че защо да питате? Не става въпрос за това как. Става дума за въпроса кога. Можете да зададете подобни въпроси, както по-долу:
- Закръглявате ли входните стойности ПРЕДИ да извършите изчисления?
- Или изчислявате ли входните стойности и след това закръглявате резултата?
Могат да възникнат още въпроси в зависимост от изчисленията, които ще направите.
Въпросът е дали получавате закръгляването на стандарта или модела от потребителите. След това можете да използвате този модел за писане на заявки. Не предполагате и не предполагате какво би довело до разногласия по-късно. И ако ви помогне да включите този стандарт като бележка някъде в отчета, направете го.
Друга част от стандарта е колко десетични знака да използвате. Ами ако колоната на таблицата има тип данни DECIMAL(10,4)? Как ще го закръглите само до 2 знака след десетичната запетая?
Опитайте кода по-долу:
DECLARE @value DECIMAL(10,4)
SET @value = 8346.1556
-- This will result in 8346.16 instead of 8346.1600
SELECT CAST(ROUND(@value, 2) AS DECIMAL(10,2))
CAST след КРЪГЛА ще покаже само два знака след десетичната запетая. Двете нули ще бъдат съкратени:
Разбиране Как SQL закръгля до десетични знаци
Тук отговаряме на първия ни въпрос. Когато закръглите 1,15 до най-близките десети, ще бъде ли 1,2 или 1,1?
Първо го проверявате с типа данни DECIMAL:
DECLARE @value DECIMAL(3,2)
SET @value = 1.15
SELECT @value
SELECT ROUND(@value, 1) -- This will result in 1.2 or 1.20
Резултатът от кода по-горе е 1.20 или 1.2:
Но какво ще стане, ако типът данни е FLOAT? Нека се опитаме да го променим.
DECLARE @value FLOAT
SET @value = 1.15
SELECT @value
SELECT ROUND(@value, 1) -- This will result to 1.1
Какъв е резултатът? Това е 1.1. Вижте го сами:
Не че искам да ви дам още съмнения. Трябва обаче да знаете, че тези типове данни, въпреки че и двата се използват за числа, не са създадени еднакво .
- FLOAT и REAL са приблизителни числа, не се препоръчват за закръгляване – дори не за проверки на равенство в клауза WHERE.
- DECIMAL и NUMERIC имат фиксирана точност и мащаб и ние ги наричаме точни числа. Следователно, когато закръглим 1,15 до най-близките десети, верният отговор е 1,2.
- Целите числа също са точни числа. Те са безопасни за закръгляване на цели цифри.
Дилемата започва от дизайна на масата. Може да искате да направите нещо за колоните FLOAT или REAL, които ще бъдат закръглени някъде.
3. Използвайте SQL ROUND върху същия източник на данни за последователност
Да приемем, че трябва да създадете няколко отчета за приходите, за да покажете различни подробности:обобщение, подробна разбивка по тип и подробна разбивка по източник. Всички тези три доклада ще третират центовете или десетичните части като несъществени. Така че закръгляването на стойностите до цели числа е неизбежно.
За последователни резултати и в трите отчета приложете следното:
- ИЗБЕРЕТЕ от същите основни таблици, за да сте сигурни, че общите суми от подробностите са в съответствие с обобщението.
- Използвайте същия модел за закръгляне (точка №1 по-горе)
Искате ли да сте доволни от потребителите си в тези отчети за приходите? Бъдете последователни в това къде и как получавате номерата си.
4. SQL ПОД или ТАВАН VS КРЪГЛА
Може да има случаи, в които трябва да закръглите нагоре или надолу до следващото цяло число. В този случай CEILING() или FLOOR() е подходящият избор вместо ROUND()
CEILING() закръглява стойност до следващото цяло число:
SELECT CEILING(1); -- returns 1
SELECT CEILING(1.6); -- returns 2
SELECT CEILING(1.4); -- returns 2
Междувременно FLOOR() закръглява надолу:
SELECT FLOOR(1); -- returns 1
SELECT FLOOR(2.1); -- returns 2
SELECT FLOOR(2.9); -- returns 2
5. Тествайте резултатите с вашите потребители
След като завършите всички заявки и дизайна на отчета, последната част е да проверите работата си с потребителите. Можем да правим грешки, независимо колко сме добри или колко упорито работим. Понякога се нуждаем от още няколко итерации, за да се оправим.
Вашите потребители ще имат тестови сценарии, които ще гарантират точността на отчетите. Или тя може да направи ръчно файл на Excel, за да сравни вашата работа с тяхната. Във всеки случай работете с тях за по-добра система. Ще се радвате, че го направихте.
Заключение
Работата със SQL ROUND може да бъде трудна понякога. Въпреки това, представените тук съвети доказват, че можете да спечелите срещу тези препятствия. Какво научихте?
- Поискайте закръгляването на стандарта или модела от вашите потребители.
- Познайте типа данни, който използвате.
- Използвайте ROUND за един и същ източник на данни за последователност.
- Понякога ПОД или ТАВАН може да са подходящи от КРЪГЛА.
- Накрая тествайте резултатите си с потребителите си.
Полезна ли е тази публикация? Ако е за вас, може и други да се нуждаят от него. Моля, споделете тази публикация в любимите си социални медии.
Свързани статии
- Изчисляване на текущия общ брой с клауза OVER и клауза PARTITION BY в SQL Server
- Изчислете медианата чрез използване на Transact SQL