powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Деление, которого я не видел никогда!
7 сообщений из 7, страница 1 из 1
Деление, которого я не видел никогда!
    #32070408
BJValentine
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В запросе делаю:

select field1, (2/3) as ddd
from table1

в поле ddd выдаёт 0 - округляет, но какого...
...
Рейтинг: 0 / 0
Деление, которого я не видел никогда!
    #32070410
vap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Правильно, сервер использует тип INT
поэтому INT(2)/INT(3) = 0
а select 2.0/3 = 0,66666
...
Рейтинг: 0 / 0
Деление, которого я не видел никогда!
    #32072110
Не всегда так он делит (имею ввиду linked server, причем каждый Linked Server будет вести себя по разному здесь в качестве примера Linked server к Access'у ).

Зная, что сервер так делает я разделял поле на три пока не столкнулся вот с этим
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
select top  12  sm.КодМедуслуги/ 100000  As MUGroupCode,sm.КодМедуслуги/ 10  As tmp, 10 *(sm.КодМедуслуги/ 10 ) As tmp2,
			(sm.КодМедуслуги- 100000 *(sm.КодМедуслуги/ 100000 ))/ 1000  As MUGroupCode,
			sm.КодМедуслуги- 1000 *(sm.КодМедуслуги/ 1000 ) As MUCode,
			sm.КодМедуслуги  --+ Case when sm.КодМедуслуги=sm.КодМедуслуги-1 Then 0 Else 0 End 
 

		from dict...[Справочник медуслуг] sm

MUGroupCode tmp         tmp2        MUGroupCode MUCode      КодМедуслуги 
 ----------- ----------- ----------- ----------- ----------- ------------ 
 
 1             10000         100000        0             0             100000 
 1             10100         101000        0             0             101000 
 1             10100         101001        0             0             101001 
 1             10100         101002        0             0             101002 
 1             10100         101003        0             0             101003 
 1             10100         101004        0             0             101004 
 1             10100         101005        0             0             101005 
 1             10101         101007        0             0             101007 
 1             10101         101008        0             0             101008 
 1             10101         101009        0             0             101009 
 1             10101         101010        0             0             101010 
 1             10101         101011        0             0             101011 

( 12  row(s) affected)

 --Теперь убираю коментарий в последнем поле в селекте и получаю то-что хотел
 

select top  12  sm.КодМедуслуги/ 100000  As MUGroupCode,sm.КодМедуслуги/ 10  As tmp, 10 *(sm.КодМедуслуги/ 10 ) As tmp2,
			(sm.КодМедуслуги- 100000 *(sm.КодМедуслуги/ 100000 ))/ 1000  As MUGroupCode,
			sm.КодМедуслуги- 1000 *(sm.КодМедуслуги/ 1000 ) As MUCode,
			sm.КодМедуслуги + Case when sm.КодМедуслуги=sm.КодМедуслуги- 1  Then  0  Else  0  End 

		from dict...[Справочник медуслуг] sm


MUGroupCode tmp         tmp2        MUGroupCode MUCode                  
 ----------- ----------- ----------- ----------- ----------- ----------- 
 
 1             10000         100000        0             0             100000 
 1             10100         101000        1             0             101000 
 1             10100         101000        1             1             101001 
 1             10100         101000        1             2             101002 
 1             10100         101000        1             3             101003 
 1             10100         101000        1             4             101004 
 1             10100         101000        1             5             101005 
 1             10100         101000        1             7             101007 
 1             10100         101000        1             8             101008 
 1             10100         101000        1             9             101009 
 1             10101         101010        1             10            101010 
 1             10101         101010        1             11            101011 

( 12  row(s) affected)



Причем в предложении where могут возникать такие грабли
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
select top  12  sm.КодМедуслуги/ 100000  As MUGroupCode,sm.КодМедуслуги/ 10  As tmp, 10 *(sm.КодМедуслуги/ 10 ) As tmp2,
			(sm.КодМедуслуги- 100000 *(sm.КодМедуслуги/ 100000 ))/ 1000  As MUGroupCode,
			sm.КодМедуслуги- 1000 *(sm.КодМедуслуги/ 1000 ) As MUCode,
			sm.КодМедуслуги + Case when sm.КодМедуслуги=sm.КодМедуслуги- 1  Then  0  Else  0  End 

		from dict...[Справочник медуслуг] sm
		 --where (sm.КодМедуслуги-100000*(sm.КодМедуслуги/100000))/1000 <>0
 

MUGroupCode tmp         tmp2        MUGroupCode MUCode                  
 ----------- ----------- ----------- ----------- ----------- ----------- 
 
 1             10000         100000        0             0             100000 
 1             10100         101000        1             0             101000 
 1             10100         101000        1             1             101001 
 1             10100         101000        1             2             101002 
 1             10100         101000        1             3             101003 
 1             10100         101000        1             4             101004 
 1             10100         101000        1             5             101005 
 1             10100         101000        1             7             101007 
 1             10100         101000        1             8             101008 
 1             10100         101000        1             9             101009 
 1             10101         101010        1             10            101010 
 1             10101         101010        1             11            101011 

( 12  row(s) affected)

select top  12  sm.КодМедуслуги/ 100000  As MUGroupCode,sm.КодМедуслуги/ 10  As tmp, 10 *(sm.КодМедуслуги/ 10 ) As tmp2,
			(sm.КодМедуслуги- 100000 *(sm.КодМедуслуги/ 100000 ))/ 1000  As MUGroupCode,
			sm.КодМедуслуги- 1000 *(sm.КодМедуслуги/ 1000 ) As MUCode,
			sm.КодМедуслуги + Case when sm.КодМедуслуги=sm.КодМедуслуги- 1  Then  0  Else  0  End 

		from dict...[Справочник медуслуг] sm
		where (sm.КодМедуслуги- 100000 *(sm.КодМедуслуги/ 100000 ))/ 1000  <> 0 

MUGroupCode tmp         tmp2        MUGroupCode MUCode                  
 ----------- ----------- ----------- ----------- ----------- ----------- 
 

( 0  row(s) affected)


select top  12  sm.КодМедуслуги/ 100000  As MUGroupCode,sm.КодМедуслуги/ 10  As tmp, 10 *(sm.КодМедуслуги/ 10 ) As tmp2,
			(sm.КодМедуслуги- 100000 *(sm.КодМедуслуги/ 100000 ))/ 1000  As MUGroupCode,
			sm.КодМедуслуги- 1000 *(sm.КодМедуслуги/ 1000 ) As MUCode,
			sm.КодМедуслуги + Case when sm.КодМедуслуги=sm.КодМедуслуги- 1  Then  0  Else  0  End 

		from dict...[Справочник медуслуг] sm
		where (sm.КодМедуслуги- 100000 *(sm.КодМедуслуги/ 100000 ))/ 1000  + 
		Case when sm.КодМедуслуги=sm.КодМедуслуги- 1  Then  0  Else  0  End <> 0 

MUGroupCode tmp         tmp2        MUGroupCode MUCode                  
 ----------- ----------- ----------- ----------- ----------- ----------- 
 
 1             10100         101000        1             0             101000 
 1             10100         101000        1             1             101001 
 1             10100         101000        1             2             101002 
 1             10100         101000        1             3             101003 
 1             10100         101000        1             4             101004 
 1             10100         101000        1             5             101005 
 1             10100         101000        1             7             101007 
 1             10100         101000        1             8             101008 
 1             10100         101000        1             9             101009 
 1             10101         101010        1             10            101010 
 1             10101         101010        1             11            101011 
 1             10101         101010        1             12            101012 

( 12  row(s) affected)

...
Рейтинг: 0 / 0
Деление, которого я не видел никогда!
    #32072345
Bzzzzz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Интересно, а почему
select 2.0/3 дает 0.666666666666 , тогда как select 2/3.0 - 0.666666? Кто-нить, подскажите, плз! Частенько упираюсь в точность, приходится гемориться... :(((
...
Рейтинг: 0 / 0
Деление, которого я не видел никогда!
    #32072347
Фотография tygra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так округлять сразу надо, тогда и с точностью проблем не будет
...
Рейтинг: 0 / 0
Деление, которого я не видел никогда!
    #32072356
Bzzzzz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Округлять-то и не надо! Наоборот... Иногда и восьмой знак ловить требуется, и десятый... Приходится CONVERTами... Мож, какие установки есть?
...
Рейтинг: 0 / 0
Деление, которого я не видел никогда!
    #32072736
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Bzzzzz

Интересно, а почему
select 2.0/3 дает 0.666666666666 , тогда как select 2/3.0 - 0.666666?


Почитайте BOL - Accessing and Changing Relational Data - Transact-SQL Syntax Elements - Using Data Types - Data Type Conversion про Implicit conversions
и
Transact-SQL Reference - Data Types - Data Type Precedence

ЗЫ
У меня запросы
select 2.0/3
select 2/3.0
выдают совршенно одинаковые результаты
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Деление, которого я не видел никогда!
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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