Вопрос по типу данных в результирующей таблице

2viper2viper
Дата: 15.04.2015 21:53:58
Не могу понять, почему в результирующей таблице в поле "Факт" подгружается 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
2viper2viper
Дата: 15.04.2015 21:55:36
Результат во вложении
Нужно в поле Факт получить целочисельные значения
o-o
Дата: 15.04.2015 22:46:24
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
alexeyvg
Дата: 15.04.2015 22:46:35
2viper2viper
Не могу понять, почему в результирующей таблице в поле "Факт" подгружается decimal (10,2).
в исходной таблице int
Что именно "в исходной таблице int", какое поле?

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

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

При UNION из 2х типов делается приведение к "старшему"
2viper2viper
Дата: 15.04.2015 23:14:33
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