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

Откуда:
Сообщений: 193
Всем добрый день!

Столкнулся с такой вещью:
-есть таблица t с полями типа decimal(14,2), некоторые значения в полях могут быть null
-есть некоторая вьюка на базе этой таблицы в которой есть следующая конструкция
SELECT
...
,prc=CASE WHEN ... THEN t.pol1 ELSE t.pol2 END
...
FROM t
...

В результате вьюка при некоторых условиях выводит для колонки PRC значения типа 1234.281 вместо 1234.28 (это значение хранящееся в базе)

В базе в таблице t все значения в полях с точностью до 2-х знаков.

пока поставил там, что-то типа:
SELECT
...
,prc=convert(deimal(14,2),CASE WHEN ... THEN t.pol1 ELSE t.pol2 END)
...
FROM t
...

Но причина не совсем понятна. Что тут может быть?
24 июл 09, 13:06    [7456098]     Ответить | Цитировать Сообщить модератору
 Re: Что-то непонятка с числовым типом  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74927
Давайте вместо "некоторые значения ... некоторая вьюка... при некоторых условиях выводит ...CASE WHEN ... THEN t.pol1 ELSE t.pol2 END"

Приведите:

1. SELECT @@version.
2. DDL на таблицу и вьюху.
3. Образцы данных и результат.
4. И скажите, в какой клиентской программе Вы получаете "1234.281 вместо 1234.28".
24 июл 09, 13:11    [7456142]     Ответить | Цитировать Сообщить модератору
 Re: Что-то непонятка с числовым типом  [new]
aleks2
Guest
declare @x as bit
set @x=1
select case @x WHEN 1 THEN cast(123 as bit) ELSE cast(123 as int) END
select case @x WHEN 1 THEN cast(123 as bit) ELSE cast(123 as float) END
select case @x WHEN 1 THEN cast(123 as int) ELSE cast(123 as datetime) END
select case @x WHEN 1 THEN cast(123 as float) ELSE cast(123 as datetime) END
select case @x WHEN 1 THEN cast(123 as decimal(6,2)) ELSE cast(123 as decimal(6,3)) END
select case @x WHEN 1 THEN cast(123 as decimal(6,2)) ELSE cast(123 as decimal(6,2)) END

"Приведение типов" называется...
24 июл 09, 13:17    [7456189]     Ответить | Цитировать Сообщить модератору
 Re: Что-то непонятка с числовым типом  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74927
aleks2
declare @x as bit
set @x=1

select case @x WHEN 1 THEN cast(123 as decimal(6,2)) ELSE cast(123 as decimal(6,2)) END

"Приведение типов" называется...


???
24 июл 09, 13:21    [7456230]     Ответить | Цитировать Сообщить модератору
 Re: Что-то непонятка с числовым типом  [new]
smm
Member

Откуда:
Сообщений: 193
Вот ниже представил образцы. Имена таблиц и вьюк изменены и показаны не все поля
Вывод данных делаем в SQLAnalyzer

CREATE TABLE [tbl] (
	...
	[Цена1] [decimal](14, 2) NULL ,
	[Цена2] [decimal](14, 2) NULL ,
	...
)

create view v as
select
...
[Цена1],
[Цена2],
case 
when [PriceId]=1 then [Цена1]
when [PriceId]<>1 then [Цена2]
end
as price
from tbl

select distinct price,[Цена1],[Цена2] 
from v 
where idprod in(31123,1178)

price            [Цена1]             [Цена2] 
---------	      ---------           ---------
67874.281     67874.28           NULL
305866.78     305866.78         NULL


Обратите внимание на
case 
when [PriceId]=1 then [Цена1]
when [PriceId]<>1 then [Цена2]
end
as price

Именно здесь происходит что-то с типом данных. На двойной WHEN и русскоязычные поля внимания не обращайте -я это менять не могу.
24 июл 09, 15:37    [7457512]     Ответить | Цитировать Сообщить модератору
 Re: Что-то непонятка с числовым типом  [new]
Glory
Member

Откуда:
Сообщений: 104760
А что про тип и размер этого поля скажет
SELECT * from INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'v'
24 июл 09, 15:43    [7457588]     Ответить | Цитировать Сообщить модератору
 Re: Что-то непонятка с числовым типом  [new]
smm
Member

Откуда:
Сообщений: 193
column_name data_type numeric_precision numeric_scale
------------- ---------- ----------------- -------------
Цена1 decimal 14 2
Цена2 decimal 14 2
24 июл 09, 16:25    [7457983]     Ответить | Цитировать Сообщить модератору
 Re: Что-то непонятка с числовым типом  [new]
Glory
Member

Откуда:
Сообщений: 104760
smm
column_name data_type numeric_precision numeric_scale
------------- ---------- ----------------- -------------
Цена1 decimal 14 2
Цена2 decimal 14 2

А price где ?
24 июл 09, 16:26    [7457994]     Ответить | Цитировать Сообщить модератору
 Re: Что-то непонятка с числовым типом  [new]
smm
Member

Откуда:
Сообщений: 193
Пардон, я сделал запрос для таблицы "t". Для вьюки "v" типы данных стоят real

Стал разбираться в этом коде вьюки "V" более детально выяснилось, что вьюка "V" строится на базе другой вьюки "t_", которая в свою очередь строится на базе таблицы "t". И в этой вьюке "t_" значения полей [Цена1], [Цена2] умножается на поле с типом real, хотя это поле всегда равно 1

Т.е. получается, что тип меняется уже во вложенной вьюке "t_" и в наружную вьюку "v" уходят уже данные с типом real.

Приношу извинения общественности, что проморгал знак подчеркивания в "t_", думал вьюка строится на основании таблицs, а там еще одна вложенная вьюка оказывается есть.

Всем спасибо.
24 июл 09, 17:01    [7458277]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить