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

Откуда:
Сообщений: 271
Не могу понять, почему в результирующей таблице в поле "Факт" подгружается decimal (10,2).
в исходной таблице int

вот запрос хранимой процедуры
+
ALTER PROCEDURE [dbo].[SELECT_PAYMENTS_PLAN_PERIOD] @id_office int, @period nvarchar(10)
AS
With Pivoted as
(
SELECT z.Виды, z.Факт, z.План, case when z.План = 0 then '--' else RTRIM(CAST(ROUND( ISNULL(z.Факт,0)/z.План*100, 1)as numeric(4,1)) )+'%' end as 'Выполнение',0 as 'sort'
FROM(
SELECT Type = 'Факт', v.name as 'Виды',sum(p.Sum) as 'Значение'  
FROM  [PORT].[dbo].[tb_payments] p
left join [PORT].[dbo].[tb_vid] v on p.id_vid = v.id
WHERE p.id_office = @id_office and RTRIM(month(p.date))+'-'+RTRIM(year(p.date)) = @period
GROUP BY v.name
UNION ALL
SELECT Type = 'План', v.name as 'Виды', sum(p.Sum) as 'Значение' 
FROM  [PORT].[dbo].[tb_plans] p
left join [PORT].[dbo].[tb_vid] v on p.id_vid = v.id
WHERE p.id_office = @id_office and RTRIM(month(p.date))+'-'+RTRIM(year(p.date)) = @period
GROUP BY v.name
)a
pivot (sum(a.Значение)
for a.Type in (Факт,План))z
)
SELECT z.Виды,isnull(z.Факт,0) as 'Факт', isnull(z.План,0) as 'План', z.Выполнение FROM
(
SELECT Виды,Факт,План,Выполнение,sort FROM Pivoted
UNION ALL
SELECT Виды = 'Итого', sum(Факт), sum(План), case when sum(План) = 0 then '--' else RTRIM(CAST(ROUND( ISNULL(sum(Факт),0)/sum(План)*100, 1)as numeric(4,1)) )+'%' end, 1 as 'sort' FROM Pivoted
)z
ORDER BY z.sort DESC, case when PATINDEX('%.%', z.Виды)=0 then 9999 else cast(substring(z.Виды,1,(PATINDEX('%.%', z.Виды))-1) as int) end


К сообщению приложен файл. Размер - 42Kb
15 апр 15, 21:53    [17520836]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по типу данных в результирующей таблице  [new]
2viper2viper
Member

Откуда:
Сообщений: 271
Результат во вложении
Нужно в поле Факт получить целочисельные значения

К сообщению приложен файл. Размер - 20Kb
15 апр 15, 21:55    [17520840]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по типу данных в результирующей таблице  [new]
o-o
Guest
2viper2viper
ALTER PROCEDURE [dbo].[SELECT_PAYMENTS_PLAN_PERIOD] @id_office int, @period nvarchar(10)
AS
With Pivoted as
(
SELECT z.Виды, z.Факт, z.План, case when z.План = 0 then '--' else RTRIM(CAST(ROUND( ISNULL(z.Факт,0)/z.План*100, 1)as numeric(4,1)) )+'%' end as 'Выполнение',0 as 'sort'
FROM(
SELECT Type = 'Факт', v.name as 'Виды',sum(p.Sum) as 'Значение'  
FROM  [PORT].[dbo].[tb_payments] p
left join [PORT].[dbo].[tb_vid] v on p.id_vid = v.id
WHERE p.id_office = @id_office and RTRIM(month(p.date))+'-'+RTRIM(year(p.date)) = @period
GROUP BY v.name
UNION ALL
SELECT Type = 'План', v.name as 'Виды', sum(p.Sum) as 'Значение' 
FROM  [PORT].[dbo].[tb_plans] p
left join [PORT].[dbo].[tb_vid] v on p.id_vid = v.id
WHERE p.id_office = @id_office and RTRIM(month(p.date))+'-'+RTRIM(year(p.date)) = @period
GROUP BY v.name
)a
pivot (sum(a.Значение)
for a.Type in (Факт,План))z
)
SELECT z.Виды,isnull(z.Факт,0) as 'Факт', isnull(z.План,0) as 'План', z.Выполнение FROM
(
SELECT Виды,Факт,План,Выполнение,sort FROM Pivoted
UNION ALL
SELECT Виды = 'Итого', sum(Факт), sum(План), case when sum(План) = 0 then '--' else RTRIM(CAST(ROUND( ISNULL(sum(Факт),0)/sum(План)*100, 1)as numeric(4,1)) )+'%' end, 1 as 'sort' FROM Pivoted
)z
ORDER BY z.sort DESC, case when PATINDEX('%.%', z.Виды)=0 then 9999 else cast(substring(z.Виды,1,(PATINDEX('%.%', z.Виды))-1) as int) end


у вас там UNION ALL с decimal(10,2)
declare @tb_payments table (val int);
insert into @tb_payments values(1);

declare @tb_plans table (val decimal(10,2));
insert into @tb_plans values(2);

select val
from  @tb_payments
union all
select val
from  @tb_plans
---
val
1.00
2.00
15 апр 15, 22:46    [17520992]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по типу данных в результирующей таблице  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31990
2viper2viper
Не могу понять, почему в результирующей таблице в поле "Факт" подгружается decimal (10,2).
в исходной таблице int
Что именно "в исходной таблице int", какое поле?

Я вижу, что Факт - это sum(a.Значение), а Значение - это sum(p.Sum)

А поле p.Sum имеет тип в одной таблице int, в другой decimal(10,2)

При UNION из 2х типов делается приведение к "старшему"
15 апр 15, 22:46    [17520993]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по типу данных в результирующей таблице  [new]
2viper2viper
Member

Откуда:
Сообщений: 271
alexeyvg, o-o Спасибо
добавил cast, работает

SELECT z.Виды,cast(isnull(z.Факт,0) as int) as 'Факт', isnull(z.План,0) as 'План', z.Выполнение FROM
(
SELECT Виды,Факт,План,Выполнение,sort FROM Pivoted
UNION ALL
SELECT Виды = 'Итого', sum(Факт), sum(План), case when sum(План) = 0 then '--' else RTRIM(CAST(ROUND( ISNULL(sum(Факт),0)/sum(План)*100, 1)as numeric(4,1)) )+'%' end, 1 as 'sort' FROM Pivoted
)z
ORDER BY z.sort DESC, case when PATINDEX('%.%', z.Виды)=0 then 9999 else cast(substring(z.Виды,1,(PATINDEX('%.%', z.Виды))-1) as int) end
15 апр 15, 23:14    [17521039]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить