Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Сравнение данных  [new]
ferzmikk
Member

Откуда:
Сообщений: 2270
Здравствуйте!

Есть исходные данные. Таблица, у которой для каждой меры и с уровнем детализации есть соответствующее значение.
+
DROP TABLE IF EXISTS #MyTable1;

CREATE TABLE #MyTable1
(
	Measure NVARCHAR(10),
	Level NVARCHAR(10),
	Value real
);

INSERT INTO #MyTable1 
	(Measure, Level, Value)
VALUES
	('Мера1', 'Группа', 201.7445)
	,('Мера2', 'Подгруппа1', 23.60291)
	,('Мера2', 'Подгруппа2', 178.1416)
	,('Мера3', 'Группа', 286376.8)
	,('Мера4', 'Подгруппа1', 218775.3)
	,('Мера4', 'Подгруппа2', 67601.47)
;
Логика тут такая, что для Мера1 уровень Группа должна равняться Мера2 сумме Подгруппа1 и Подгруппа2. Поэтому необходимо сделать сверку между итоговыми строками и суммированием строк уровня ниже.

Переводим в другую разрядность
+
DECLARE @TempVar SMALLINT = 3; --Задаем количество цифр после запятой

DROP TABLE IF EXISTS #MyTable2;

SELECT
	Measure,
	Level,
	Round(Value / 1000, @TempVar, 1) AS Value
INTO
	#MyTable2
FROM
	#MyTable1; 
Сверка для Мера1 и Мера2
+
SELECT
	t1.Measure AS [Первая мера],
	t1.Value AS [Значение первой меры],
	t2.Measure AS [Вторая мера],
	t2.Value + t3.Value AS [Значение второй меры],
	IIF(t1.Value = (t2.Value + t3.Value), 'Равно', 'Не равно') AS [Результат сверки]
FROM
	#MyTable2 t1,
	#MyTable2 t2,
	#MyTable2 t3
WHERE
	t1.Measure = 'Мера1'
	AND
	t2.Measure = 'Мера2'
	AND
	t3.Measure = 'Мера2'
	AND
	t1.Level = 'Группа'
	AND
	t2.Level = 'Подгруппа1'
	AND
	t3.Level = 'Подгруппа2'	
;
При @TempVar = 3 возвращает такой результат:
Первая мера Значение первой меры Вторая мера Значение второй меры Результат сверки
Мера1 0.201 Мера2 0.201 Не равно

А при @TempVar = 5 - такой результат:
Первая мера Значение первой меры Вторая мера Значение второй меры Результат сверки
Мера1 0.20174 Мера2 0.20174 Равно

Сверка между Мера3 и Мера4
+
SELECT
	t1.Measure AS [Первая мера],
	t1.Value AS [Значение первой меры],
	t2.Measure AS [Вторая мера],
	t2.Value + t3.Value AS [Значение второй меры],
	IIF(t1.Value = (t2.Value + t3.Value), 'Равно', 'Не равно') AS [Результат сверки]
FROM
	#MyTable2 t1,
	#MyTable2 t2,
	#MyTable2 t3
WHERE
	t1.Measure = 'Мера3'
	AND
	t2.Measure = 'Мера4'
	AND
	t3.Measure = 'Мера4'
	AND
	t1.Level = 'Группа'
	AND
	t2.Level = 'Подгруппа1'
	AND
	t3.Level = 'Подгруппа2'	
;
При @TempVar = 1 возвращает такой результат:
Первая мера Значение первой меры Вторая мера Значение второй меры Результат сверки
Мера3 286.3 Мера4 286.3 Не равно


А при @TempVar = 2 - такой результат:
Первая мера Значение первой меры Вторая мера Значение второй меры Результат сверки
Мера3 286.37 Мера4 286.37 Равно

Таким образом, в некоторых случаях, где Значение первой меры и Значение второй меры совпадает, в поле Результат сверки возвращает значение "Не равно".

Скажите, как правильно написать, чтобы при одинаковых отображающих значении двух сравниваемых мер при заданном @TempVar в поле Результат сверки возвращалось "Равно"?
13 янв 22, 15:54    [22420485]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение данных  [new]
court
Member

Откуда:
Сообщений: 2482
ferzmikk,

сравнивай с какой-то "дельтой"

не
t1.Value = (t2.Value + t3.Value)
а
abs(t1.Value - (t2.Value + t3.Value)) < @delta


@delta можно как-то через @TempVar формировать ...
13 янв 22, 16:45    [22420524]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение данных  [new]
ferzmikk
Member

Откуда:
Сообщений: 2270
ferzmikk

Таким образом, в некоторых случаях, где Значение первой меры и Значение второй меры совпадает, в поле Результат сверки возвращает значение "Не равно".
А почему так получатся?
13 янв 22, 16:50    [22420531]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение данных  [new]
Kolu4ka
Member

Откуда:
Сообщений: 56
ferzmikk,
у вас тип данных real, переходите на decimal.
13 янв 22, 17:07    [22420551]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение данных  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 9324
ferzmikk,

формат с плавающей точкой не хранит точные значения.
14 янв 22, 00:24    [22420754]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение данных  [new]
andy st
Member

Откуда:
Сообщений: 934
ferzmikk,
в стародавние времена, когда динозавры бродили по планете, преподавали целый курс по машинным методам вычислений, в которых отдельным разделом шло описание процессорного представления float, его особенностей и методов борьбы с ними
select cast(64.35 as float)
select cast(1000.0 * cast(64.35 as float) as int)
select round(1000.0 * cast(64.35 as float) ,0)

Посмотрите на досуге результаты вычислений этого скрипта и попытайтесь разобраться с причинами.
А еще грандиозные проблемы для понимания создаёт современная Management Studio, которая форматирует результат вычислений с float с его округлением. В том же Query Analyzer первая строка показывает немного иной результат, чем в SSMS и может натолкнуть на мысль, что с float что-то не так и это надо учитывать в математике. В SSMS же кажется, что всё ОК, но на самом деле всё очень даже плохо.
14 янв 22, 06:05    [22420796]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение данных  [new]
aleks222
Member

Откуда:
Сообщений: 1994
Владислав Колосов
ferzmikk,

формат с плавающей точкой не хранит точные значения.


Ну что за бред? Хранит оно "точные" значения.
Что "неточного" ты могешь хранить в 8 байтах?
14 янв 22, 07:27    [22420815]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение данных  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 9324
aleks222,

например, десятичное 0.3 в формате с плавающей точкой может быть представлено только бесконечным двоичным рядом, фактически, ограниченного точностью хранения.

select cast(cast(0.5 as real) as varbinary(max))
select cast(cast(0.3 as real) as varbinary(max))
14 янв 22, 13:42    [22421011]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение данных  [new]
aleks222
Member

Откуда:
Сообщений: 1994
Владислав Колосов
aleks222,

например, десятичное 0.3 в формате с плавающей точкой может быть представлено только бесконечным двоичным рядом, фактически, ограниченного точностью хранения.

select cast(cast(0.5 as real) as varbinary(max))
select cast(cast(0.3 as real) as varbinary(max))


"Неточность" то хде?
Это ты пытаешься впихнуть невпихуемое и валишь с больной головы на здоровую.

0.5 записывается в real всегда ОДИНАКОВО.
Хочешь сравнить @real с 0.5 - пиши: @real = cast(0.5 as real).
Любитель точности.

select cast( 0.5 as int )


Рассуждаючи как ты, дык, и int - "неточное".

Сообщение было отредактировано: 14 янв 22, 14:23
14 янв 22, 14:18    [22421068]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение данных  [new]
andy st
Member

Откуда:
Сообщений: 934
select case when cast(0.1 as float)+cast(0.2 as float) = cast(0.3 as float) then 1 else 0 end oops
14 янв 22, 20:08    [22421299]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение данных  [new]
aleks222
Member

Откуда:
Сообщений: 1994
andy st
select case when cast(0.1 as float)+cast(0.2 as float) = cast(0.3 as float) then 1 else 0 end oops


Тебя же не смущает?

select case when cast(0.5 as int)+cast(0.5 as int) = cast(1.0 as int) then 1 else 0 end oops
15 янв 22, 06:20    [22421404]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение данных  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 9324
aleks222,

очевидно, что последнее доказательство - это мошенничество, основанное на нарушении правил. Существует доказательство 2х2=5 тоже в таком стиле.

Сообщение было отредактировано: 15 янв 22, 15:40
15 янв 22, 15:33    [22421555]     Ответить | Цитировать Сообщить модератору
 Re: Сравнение данных  [new]
aleks222
Member

Откуда:
Сообщений: 1994
Владислав Колосов
aleks222,

очевидно, что последнее доказательство - это мошенничество, основанное на нарушении правил. Существует доказательство 2х2=5 тоже в таком стиле.


С этого места помеееедленнееееее, я записываю.

ЗЫ. Разучите уже как устроен FLOAT, а не тупо повторяйте мифы.
15 янв 22, 16:50    [22421585]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить