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

Откуда:
Сообщений: 43
Есть запрос:
SELECT DISTINCT SUBSTRING(CONVERT(VarChar(8), Period), 5, 2) + '.' + SUBSTRING(CONVERT(VarChar(8), Period), 1, 4) AS Period
FROM         mVersion

Который выбирает даты вида:
200103  и приводит к виду 03.2001
200106                    06.2001
200109                    09.2001                           
200112                    12.2001
........................................


Но верхний запрос используется в основном запросе где выбранное данное подставляется в @fPeriod:
declare @t table(id int, period int)
insert into @t(id, period) select 1, @fPeriod - 100 
insert into @t(id, period) select 2, @fPeriod

SELECT     o.OriginalName AS N1, 
	SUM((case when t.id=1 and f.FiscalActivities = 0100 AND f.PeriodType = 01
		  then f.sum else 0 end)
	- 
	    (case when t.id=1 and f.FiscalActivities = 0100 AND f.PeriodType = 02
		  then f.sum else 0 end)) AS S1, 
	SUM((case when t.id=2 and f.FiscalActivities = 0100 AND f.PeriodType = 01
		  then f.sum else 0 end)
	- 
	    (case when t.id=2 and f.FiscalActivities = 0100 AND f.PeriodType = 02
		  then f.sum else 0 end)) AS S2, 
	SUM((case when t.id=2 and f.FiscalActivities = 0010 AND f.PeriodType = 01
		  then f.sum else 0 end)
	- 
	    (case when t.id=2 and f.FiscalActivities = 0010 AND f.PeriodType = 02
		  then f.sum else 0 end) 
	+
	    (case when t.id=2 and f.FiscalActivities = 0080 AND f.PeriodType = 01
		  then f.sum else 0 end) 
	- 
	    (case when t.id=2 and f.FiscalActivities = 0080 AND f.PeriodType = 02
		  then f.sum else 0 end)) AS S3,o.MainGroup AS G1
FROM      @t t inner join
	mVersion m ON t.period = m.Period INNER JOIN
	F33 f ON f.VersionID = m.VersionID INNER JOIN
            OrgSpr o ON m.Period = o.Period AND m.BusinessProcessID = o.BusinessProcessID
WHERE (NOT (o.MainGroup IS NULL))
group by o.OriginalName, o.MainGroup
ORDER BY o.OriginalName

И чтобы он выполнялся нужно сделать обратное преобразование.
Я пытался сделать так:
DECLARE @d VarChar(8)
SET              @d = 12.2001
SELECT     CONVERT(int, SUBSTRING(@d, 4, 4) + SUBSTRING(@d, 1, 2))

При @d=12.2001 получаю "200112"
а если @d=03.2001 то "0013."

Возможно кто сталкивался как это обойти, был бы рад за любую подсказку.
Спасибо!
23 ноя 09, 14:21    [7964478]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь в преобразовании данных  [new]
Glory
Member

Откуда:
Сообщений: 104760
03.2001 - это десятичное число, которое сервер воспринимает как 3.2001
23 ноя 09, 14:24    [7964510]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь в преобразовании данных  [new]
iljy
Member

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

DECLARE @d VarChar(8)
SET              @d = '03.2001'
SELECT     CONVERT(int, SUBSTRING(@d, 4, 4) + SUBSTRING(@d, 1, 2))
23 ноя 09, 14:26    [7964528]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь в преобразовании данных  [new]
Demonoid75
Member

Откуда:
Сообщений: 43
iljy
Demonoid75,

DECLARE @d VarChar(8)
SET              @d = '03.2001'
SELECT     CONVERT(int, SUBSTRING(@d, 4, 4) + SUBSTRING(@d, 1, 2))


Спасибо не доглядел...
Когда я подставляю в основной запрос:
declare @t table(id int, period int)
insert into @t(id, period) select 1, CONVERT(int, SUBSTRING(@fPeriod - 100, 4, 4) + SUBSTRING(@fPeriod - 100, 1, 2)) 
insert into @t(id, period) select 2, CONVERT(int, SUBSTRING(@fPeriod, 4, 4) + SUBSTRING(@fPeriod, 1, 2))
SELECT     o.OriginalName AS N1,
...................................................................... 

Выдает ошибку: "Тип данных аргумента int недопустим для аргумента 1 функции SUBSTRING"
Не могу понять почему....
23 ноя 09, 14:43    [7964702]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь в преобразовании данных  [new]
Glory
Member

Откуда:
Сообщений: 104760
Demonoid75


Выдает ошибку: "Тип данных аргумента int недопустим для аргумента 1 функции SUBSTRING"
Не могу понять почему....

Да все потому же. Нельзя пихать в функции аргументы, тип которых отличается от того, что хочет функция
23 ноя 09, 14:45    [7964714]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь в преобразовании данных  [new]
Demonoid75
Member

Откуда:
Сообщений: 43
Glory
Demonoid75


Выдает ошибку: "Тип данных аргумента int недопустим для аргумента 1 функции SUBSTRING"
Не могу понять почему....

Да все потому же. Нельзя пихать в функции аргументы, тип которых отличается от того, что хочет функция


Получается это невозможно?
23 ноя 09, 14:48    [7964739]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь в преобразовании данных  [new]
pacha
Member

Откуда:
Сообщений: 239
Demonoid75

Выдает ошибку: "Тип данных аргумента int недопустим для аргумента 1 функции SUBSTRING"
Не могу понять почему....

Предварительно надо сконвертировать в строку выражение
@fPeriod - 100
23 ноя 09, 14:49    [7964750]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь в преобразовании данных  [new]
Glory
Member

Откуда:
Сообщений: 104760
Demonoid75
Glory
Demonoid75


Выдает ошибку: "Тип данных аргумента int недопустим для аргумента 1 функции SUBSTRING"
Не могу понять почему....

Да все потому же. Нельзя пихать в функции аргументы, тип которых отличается от того, что хочет функция


Получается это невозможно?

Разумеется невозможно заставить функцию, у которой 1ый аргумент символьный, вдруг работать с int, который вы так усиленно хотите ей "впарить"
23 ноя 09, 14:50    [7964761]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить