powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Сравнение данных
13 сообщений из 13, страница 1 из 1
Сравнение данных
    #40126344
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте!

Есть исходные данные. Таблица, у которой для каждой меры и с уровнем детализации есть соответствующее значение.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
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 . Поэтому необходимо сделать сверку между итоговыми строками и суммированием строк уровня ниже.

Переводим в другую разрядность
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
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
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
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
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
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 в поле Результат сверки возвращалось "Равно"?
...
Рейтинг: 0 / 0
Сравнение данных
    #40126360
Фотография court
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ferzmikk,

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

не
Код: sql
1.
t1.Value = (t2.Value + t3.Value)

а
Код: sql
1.
abs(t1.Value - (t2.Value + t3.Value)) < @delta



@delta можно как-то через @TempVar формировать ...
...
Рейтинг: 0 / 0
Сравнение данных
    #40126361
ferzmikk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ferzmikk

Таким образом, в некоторых случаях, где Значение первой меры и Значение второй меры совпадает, в поле Результат сверки возвращает значение "Не равно".
А почему так получатся?
...
Рейтинг: 0 / 0
Сравнение данных
    #40126367
Kolu4ka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ferzmikk,
у вас тип данных real, переходите на decimal.
...
Рейтинг: 0 / 0
Сравнение данных
    #40126444
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ferzmikk,

формат с плавающей точкой не хранит точные значения.
...
Рейтинг: 0 / 0
Сравнение данных
    #40126468
andy st
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ferzmikk,
в стародавние времена, когда динозавры бродили по планете, преподавали целый курс по машинным методам вычислений, в которых отдельным разделом шло описание процессорного представления float, его особенностей и методов борьбы с ними
Код: sql
1.
2.
3.
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 же кажется, что всё ОК, но на самом деле всё очень даже плохо.
...
Рейтинг: 0 / 0
Сравнение данных
    #40126470
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владислав Колосов
ferzmikk,

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


Ну что за бред? Хранит оно "точные" значения.
Что "неточного" ты могешь хранить в 8 байтах?
...
Рейтинг: 0 / 0
Сравнение данных
    #40126578
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aleks222,

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

Код: sql
1.
2.
select cast(cast(0.5 as real) as varbinary(max))
select cast(cast(0.3 as real) as varbinary(max))
...
Рейтинг: 0 / 0
Сравнение данных
    #40126604
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владислав Колосов
aleks222,

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

Код: sql
1.
2.
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).
Любитель точности.

Код: sql
1.
select cast( 0.5 as int )



Рассуждаючи как ты, дык, и int - "неточное".
...
Рейтинг: 0 / 0
Сравнение данных
    #40126731
andy st
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: sql
1.
select case when cast(0.1 as float)+cast(0.2 as float) = cast(0.3 as float) then 1 else 0 end oops
...
Рейтинг: 0 / 0
Сравнение данных
    #40126772
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andy st
Код: sql
1.
select case when cast(0.1 as float)+cast(0.2 as float) = cast(0.3 as float) then 1 else 0 end oops



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

Код: sql
1.
select case when cast(0.5 as int)+cast(0.5 as int) = cast(1.0 as int) then 1 else 0 end oops
...
Рейтинг: 0 / 0
Сравнение данных
    #40126861
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aleks222,

очевидно, что последнее доказательство - это мошенничество, основанное на нарушении правил. Существует доказательство 2х2=5 тоже в таком стиле.
...
Рейтинг: 0 / 0
Сравнение данных
    #40126881
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владислав Колосов
aleks222,

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


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

ЗЫ. Разучите уже как устроен FLOAT, а не тупо повторяйте мифы.
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Сравнение данных
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]