Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Деление, которого я не видел никогда! / 7 сообщений из 7, страница 1 из 1
20.11.2002, 19:31:00
    #32070408
BJValentine
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Деление, которого я не видел никогда!
В запросе делаю:

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

в поле ddd выдаёт 0 - округляет, но какого...
...
Рейтинг: 0 / 0
20.11.2002, 19:36:49
    #32070410
vap
vap
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Деление, которого я не видел никогда!
Правильно, сервер использует тип INT
поэтому INT(2)/INT(3) = 0
а select 2.0/3 = 0,66666
...
Рейтинг: 0 / 0
25.11.2002, 17:00:08
    #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
26.11.2002, 09:44:55
    #32072345
Bzzzzz
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Деление, которого я не видел никогда!
Интересно, а почему
select 2.0/3 дает 0.666666666666 , тогда как select 2/3.0 - 0.666666? Кто-нить, подскажите, плз! Частенько упираюсь в точность, приходится гемориться... :(((
...
Рейтинг: 0 / 0
26.11.2002, 09:48:10
    #32072347
tygra
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Деление, которого я не видел никогда!
Так округлять сразу надо, тогда и с точностью проблем не будет
...
Рейтинг: 0 / 0
26.11.2002, 10:00:47
    #32072356
Bzzzzz
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Деление, которого я не видел никогда!
Округлять-то и не надо! Наоборот... Иногда и восьмой знак ловить требуется, и десятый... Приходится CONVERTами... Мож, какие установки есть?
...
Рейтинг: 0 / 0
26.11.2002, 21:24:10
    #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
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Деление, которого я не видел никогда! / 7 сообщений из 7, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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