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

Откуда:
Сообщений: 43
Добрый день!
Нужна помощь по написанию запроса.
Есть 3 таблицы:
таблица OrgSpr
VersionID UserCreate DateCreate	BusinessProcessID BusinessProcessName	OriginalName	           MainGroup	        Period
9726	adm	23.07.2007 13:15	1	Балашихинское райпо	Балашихинское Райпо	ДЕЙСТВУЮЩИЕ  РАЙПО	200603
9726	adm	23.07.2007 13:15	2	Волоколамское райпо	Волоколамское Райпо	ДЕЙСТВУЮЩИЕ  РАЙПО	200603
9726	adm	23.07.2007 13:15	3	Воскресенское райпо	Воскресенское Райпо	ДЕЙСТВУЮЩИЕ  РАЙПО	200603
9726	adm	23.07.2007 13:15	4	Дмитровское райпо	Дмитровское Райпо	ДЕЙСТВУЮЩИЕ  РАЙПО	200603
9726	adm	23.07.2007 13:15	5	Домодедовское райпо	Домодедовское Райпо	СОБСТВЕННЫЕ ХОЗЯЙСТВА	200603
таблица F33
VersionID UserCreate    DateCreate         FiscalActivities PeriodType	 Sum  DIM_dFiscal DIM_dPeriodType
204	      adm	24.07.2007 11:38	310	       2	 55	    111	       2
36	      adm	24.07.2007 11:14	404	       2	165	    234	       2
162	      adm	24.07.2007 11:32	308	       1	0	    226	       1
344	      adm	24.07.2007 12:00	305	       1	6228	    223	       1
344	      adm	24.07.2007 12:00	305	       2	6504	    223	       2
344	      adm	24.07.2007 12:00	305	       3	2059	    223	       3
344	      adm	24.07.2007 12:00	305	       4	1901	    223	       4
344	      adm	24.07.2007 12:00	306	       1	0	    224	       1
344	      adm	24.07.2007 12:00	306	       2	0	    224	       2
таблица mVersion
VersionID Period BusinessProcessID DataTypeID
1	       0	1	        1
2	   2006	        1	        1
3	 200601	        1	        2
4	 200602	        1	        2
5	 200603	        1	        2
6	 200604	        1	        2
7	 200605	        1	        2
8	 200606	        1	        2
9	 200607	        1	        2
10	 200608	        1	        2
11	 200609	        1	        2
12	 200610	        1	        2
13	 200611	        1	        2
14	 200612	        1	        2
Запрос
SELECT OrgSpr.OriginalName, F33.PeriodType AS Stolbzi, F33.FiscalActivities AS Stroki, F33.Sum, mVersion.Period
FROM F33 INNER JOIN
mVersion ON F33.VersionID = mVersion.VersionID INNER JOIN
OrgSpr ON mVersion.Period = OrgSpr.Period AND mVersion.BusinessProcessID = OrgSpr.BusinessProcessID
WHERE (mVersion.Period = @fPeriod) AND (F33.FiscalActivities IN ('0010', '0020', '0030', '0040', '0050', '0060', '0070', '0080', '0081', '0090', '0100')) OR
(mVersion.Period = @fPeriod - 100) AND (F33.FiscalActivities = 0100) AND (F33.PeriodType IN ('1', '2'))
ORDER BY OrgSpr.OriginalName, mVersion.Period, Stroki

выбирает мне нужные данные по заданному периоду @fPeriod.

А как написать запрос чтобы получить таблицу вида:

HАИМЕHОВАHИЕ 2008 г 2009 г ВСЕГО

Где столбеце HАИМЕHОВАHИЕ - перечисление организаций (OriginalName)

столбец 2008 г - Взять число Sum(таб.F33;100 строка(FiscalActivities);1 столбец (PeriodType);СООТВ.ПРОШЛОГО ГОДА (Period)) отнять Sum(таб.F33;100 строка(FiscalActivities);2 столбец (PeriodType);период СООТВ.ПРОШЛОГО ГОДА (Period) )

столбец 2009 г. - Взять число Sum(таб.F33;100 строка(FiscalActivities);1 столбец (PeriodType);период ТЕКУЩИЙ (Period) ) отнять Sum(таб.F33;100 строка(FiscalActivities);2 столбец (PeriodType);период ТЕКУЩИЙ (Period) )

столбец ВСЕГО - Взять число (Sum(таб.F33;10 строка(FiscalActivities);1 столбец (PeriodType);период ТЕКУЩИЙ (Period) ) отнять Sum(таб.F33;10 строка(FiscalActivities);2 столбец (PeriodType);период ТЕКУЩИЙ (Period) ) ) СЛОЖИТЬ (Sum(таб.F33;80 строка(FiscalActivities);1 столбец (PeriodType);период ТЕКУЩИЙ (Period) ) отнять Sum(таб.F33;80 строка(FiscalActivities);2 столбец (PeriodType);период ТЕКУЩИЙ (Period) ) )

Буду благодарен за любую подсказку, а то уже голову сломал...
9 ноя 09, 15:05    [7902361]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь по написанию запоса  [new]
Ozzy-Osbourne
Member

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

ваша выборка, возвращающая якобы "нужные данные по заданному периоду @fPeriod", ничего не возвращает на том, что Вы привели. Тестовые данные в поле f33.FiscalActivities есть набор из чисел(?) 310,404,308,305,306. Уточните, что это на самом деле - числа или строки ? если числа, но тогда почему:
автор
F33.FiscalActivities IN ('0010', '0020', '0030', '0040', '0050', '0060', '0070', '0080', '0081', '0090', '0100')
- а на след. строке:
автор
F33.FiscalActivities = 0100
Короче, дайте нормальный DDL и заполните его данными, для которых приведенный Вами запрос действительно чего-то возвращает.
Поясните также, зачем от периода отнимать 100.
PS. вот, возьмите за основу:
+
declare @orgSpr table
(
VersionID int,
UserCreate varchar(3),
DateCreate	datetime,
BusinessProcessID int,
BusinessProcessName	varchar(25),
OriginalName varchar(25),
MainGroup varchar(25),
Period char(6)
)
insert @orgspr select 9726,'adm','20070723 13:15',1,'Балашихинское райпо','Балашихинское Райпо','ДЕЙСТВУЮЩИЕ  РАЙПО',	200603
insert @orgspr select 9726,'adm','20070723 13:15',2,'Волоколамское райпо','Волоколамское Райпо','ДЕЙСТВУЮЩИЕ  РАЙПО',	200603
insert @orgspr select 9726,'adm','20070723 13:15',3,'Воскресенское райпо','Воскресенское Райпо','ДЕЙСТВУЮЩИЕ  РАЙПО',	200603
insert @orgspr select 9726,'adm','20070723 13:15',4,'Дмитровское райпо','Дмитровское Райпо','ДЕЙСТВУЮЩИЕ  РАЙПО',	200603
insert @orgspr select 9726,'adm','20070723 13:15',5,'Домодедовское райпо','Домодедовское Райпо','СОБСТВЕННЫЕ ХОЗЯЙСТВА',	200603

declare @f33 table
(
VersionID int,
UserCreate varchar(3),
DateCreate datetime,
FiscalActivities int,
PeriodType int,
Sum numeric(12,2),
DIM_dFiscal int,
DIM_dPeriodType int
)

insert @f33 select 204,      'adm','20070724 11:38',310,       2, 55	 ,  111,   2
insert @f33 select 36 ,      'adm','20070724 11:14',404,       2,165	 ,  234,   2
insert @f33 select 162,      'adm','20070724 11:32',308,       1,0	 ,  226,   1
insert @f33 select 344,      'adm','20070424 12:00',305,       1,6228 ,  223,   1
insert @f33 select 344,      'adm','20070424 12:00',305,       2,6504 ,	223,   2
insert @f33 select 344,      'adm','20070424 12:00',305,       3,2059 ,	223,   3
insert @f33 select 344,      'adm','20070424 12:00',305,       4,1901 ,	223,   4
insert @f33 select 344,      'adm','20070424 12:00',306,       1,0	 ,  224,   1
insert @f33 select 344,      'adm','20070424 12:00',306,       2,0	 ,  224,   2

declare @mVersion table
(
VersionID int,
Period int,
BusinessProcessID int,
DataTypeID int
)
insert @mVersion select  1,       0,1,        1
insert @mVersion select  2,   2006,        1,        1
insert @mVersion select  3, 200601,        1,        2
insert @mVersion select  4, 200602,        1,        2
insert @mVersion select  5, 200603,        1,        2
insert @mVersion select  6, 200604,        1,        2
insert @mVersion select  7, 200605,        1,        2
insert @mVersion select  8, 200606,        1,        2
insert @mVersion select  9, 200607,        1,        2
insert @mVersion select  10, 200608,        1,        2
insert @mVersion select  11, 200609,        1,        2
insert @mVersion select  12, 200610,        1,        2
insert @mVersion select  13, 200611,        1,        2
insert @mVersion select  14, 200612,        1,        2

declare @fPeriod int
set @fPeriod=200609

SELECT o.OriginalName, f.PeriodType AS Stolbzi, f.FiscalActivities AS Stroki, f.Sum, v.Period
FROM @f33 f 
JOIN @mVersion v ON f.VersionID = v.VersionID 
JOIN @orgSpr o ON 
v.Period = o.Period AND v.BusinessProcessID = o.BusinessProcessID
--WHERE 
--(v.Period = @fPeriod) AND 
--(f.FiscalActivities IN ('0010', '0020', '0030', '0040', '0050', '0060', '0070', '0080', '0081', '0090', '0100')) 
--OR
--(v.Period = @fPeriod - 100) AND (f.FiscalActivities = 0100) AND (f.PeriodType IN ('1', '2'))
--ORDER BY o.OriginalName, v.Period, Stroki
9 ноя 09, 21:45    [7904721]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь по написанию запоса  [new]
Demonoid75
Member

Откуда:
Сообщений: 43
Ozzy-Osbourne,

Чтоб было понятней вот таблица которая можно получить с помощью выборки:
Балашихинское Райпо за 200612 (2006 год 12 мес.)
Stroki/Stolbzi	1	2	3	4	5
10	        0	0	0	0	0
20	       54	0	0	0	0
30	        5	45	0	543	0
40	        0	0	0	54	3
50	       453	0	0	0	0
60	        0	0	0	0	0
70	       45	54	0	453	0
80	        0	0	42	0	1
81	        0	0	0	0	0
90	       45	52	0	0	0
100	        0	0		0	0
А в самом SQL это выглядит
OriginalName	        Stolbzi	Stroki	Sum	Period
Балашихинское Райпо	1	100	11640	200512
Балашихинское Райпо	2	100	2495	200512
Балашихинское Райпо	1	10	4956	200612
Балашихинское Райпо	2	10	0	200612
Балашихинское Райпо	3	10	0	200612
Балашихинское Райпо	4	10	0	200612
Балашихинское Райпо	5	10	1	200612
Балашихинское Райпо	1	20	8	200612
Балашихинское Райпо	2	20	0	200612
Балашихинское Райпо	3	20	0	200612
Балашихинское Райпо	4	20	0	200612
Балашихинское Райпо	5	20	0	200612
Балашихинское Райпо	1	30	0	200612
Балашихинское Райпо	2	30	0	200612
Балашихинское Райпо	3	30	0	200612
Балашихинское Райпо	4	30	0	200612
Балашихинское Райпо	5	30	0	200612
Балашихинское Райпо	1	40	0	200612
Балашихинское Райпо	2	40	0	200612
Балашихинское Райпо	3	40	0	200612
Балашихинское Райпо	4	40	0	200612
Балашихинское Райпо	5	40	0	200612
Балашихинское Райпо	1	50	0	200612
Балашихинское Райпо	2	50	0	200612
Балашихинское Райпо	3	50	0	200612
Балашихинское Райпо	4	50	0	200612
Балашихинское Райпо	5	50	0	200612
Балашихинское Райпо	1	60	0	200612
Балашихинское Райпо	2	60	0	200612
Балашихинское Райпо	3	60	0	200612
Балашихинское Райпо	4	60	0	200612
Балашихинское Райпо	5	60	0	200612
Балашихинское Райпо	1	70	0	200612
Балашихинское Райпо	2	70	0	200612
Балашихинское Райпо	3	70	0	200612
Балашихинское Райпо	4	70	0	200612
Балашихинское Райпо	5	70	0	200612
Балашихинское Райпо	1	80	2653	200612
Балашихинское Райпо	2	80	0	200612
Балашихинское Райпо	3	80	0	200612
Балашихинское Райпо	4	80	0	200612
Балашихинское Райпо	5	80	0	200612
Балашихинское Райпо	1	81	11737	200612
Балашихинское Райпо	2	81	0	200612
Балашихинское Райпо	3	81	0	200612
Балашихинское Райпо	4	81	0	200612
Балашихинское Райпо	5	81	0	200612
Балашихинское Райпо	1	90	859	200612
Балашихинское Райпо	2	90	0	200612
Балашихинское Райпо	3	90	0	200612
Балашихинское Райпо	4	90	0	200612
Балашихинское Райпо	5	90	0	200612
Балашихинское Райпо	1	100	20213	200612
Балашихинское Райпо	2	100	0	200612
Балашихинское Райпо	3	100	0	200612
Балашихинское Райпо	4	100	0	200612
Балашихинское Райпо	5	100	1	200612

Это F33.FiscalActivities IN ('0010', '0020', '0030', '0040', '0050', '0060', '0070', '0080', '0081', '0090', '0100')
чтобы отсечь лишние строчки.

А так в дальнейшем нам еще понадобятся данные за СООТВ.ПРОШЛОГО ГОДА по 100 строке то это F33.FiscalActivities = 0100 и есть сотая строка, а @fPeriod - 100 это например @fPeriod=200612 то 200612-100=200512 и есть СООТВ.ПРОШЛОГО ГОДА.
Это и видно во второй таблице, у нас данные по орг. за 200512 период по 100 строке и все данные за 200612 период.

А в дальнейшем я в Reporting Services получаю отчет (справа и снизу обрежу т к она большая)
		                   1													2											
		                200512	200612												200512	200612										
	                	0100	0010	0020		0030	0040	0050	0060	0070	0080	0081	0090	0100	0100	0010	0020	0030	0040	0050	0060	0070	0080	0081	0090	0100
	Балашихинское Райпо	11640	4956	8		0	0	0	0	0	2653	11737	859	20213	2495	0	0	0	0	0	0	0	0	0	0	0
	Видновское Горпо	2864	2137	385		0	0	0	0	0	14	0	0	2536	0	0	0	0	0	0	0	0	0	0	0	0
	Волоколамское Райпо	8081	0	688		0	836	0	0	0	9288	113	0	10925	7171	7806	18	0	603	0	0	841	0	0	144	9412
	Воскресенское Райпо	10464	15937	0		0	0	0	0	259	874	895	216	18181	3433	0	3309	0	0	0	0	0	994	0	0	4303

Но мне нужно в итоге получить другую таблицу (конец первого собщения), да еще проделать математические вычисления.
10 ноя 09, 11:57    [7906750]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь по написанию запоса  [new]
Demonoid75
Member

Откуда:
Сообщений: 43
У меня получилось написать запрос такого вида.
Но возможно кто подскажет как написать его по другому был бы благодарен.
SELECT     t1.OriginalName AS N1, t1.Sum - t2.Sum AS S1, t3.Sum - t4.Sum AS S2, (t5.Sum - t6.Sum) + (t7.Sum - t8.Sum) AS S3
FROM         (SELECT     OrgSpr.OriginalName, F33.Sum
                       FROM          F33 INNER JOIN
                                              mVersion ON F33.VersionID = mVersion.VersionID INNER JOIN
                                              OrgSpr ON mVersion.Period = OrgSpr.Period AND mVersion.BusinessProcessID = OrgSpr.BusinessProcessID
                       WHERE      (mVersion.Period = @fPeriod - 100) AND (F33.FiscalActivities = 0100) AND (F33.PeriodType = 01)) AS t1 FULL OUTER JOIN
                          (SELECT     OrgSpr_1.OriginalName, F33_1.Sum
                            FROM          F33 AS F33_1 INNER JOIN
                                                   mVersion AS mVersion_1 ON F33_1.VersionID = mVersion_1.VersionID INNER JOIN
                                                   OrgSpr AS OrgSpr_1 ON mVersion_1.Period = OrgSpr_1.Period AND 
                                                   mVersion_1.BusinessProcessID = OrgSpr_1.BusinessProcessID
                            WHERE      (mVersion_1.Period = @fPeriod - 100) AND (F33_1.FiscalActivities = 0100) AND (F33_1.PeriodType = 02)) AS t2 ON 
                      t1.OriginalName = t2.OriginalName FULL OUTER JOIN
                          (SELECT     OrgSpr_2.OriginalName, F33_2.Sum
                            FROM          F33 AS F33_2 INNER JOIN
                                                   mVersion AS mVersion_2 ON F33_2.VersionID = mVersion_2.VersionID INNER JOIN
                                                   OrgSpr AS OrgSpr_2 ON mVersion_2.Period = OrgSpr_2.Period AND 
                                                   mVersion_2.BusinessProcessID = OrgSpr_2.BusinessProcessID
                            WHERE      (mVersion_2.Period = @fPeriod) AND (F33_2.FiscalActivities = 0100) AND (F33_2.PeriodType = 01)) AS t3 ON 
                      t2.OriginalName = t3.OriginalName FULL OUTER JOIN
                          (SELECT     OrgSpr_3.OriginalName, F33_3.Sum
                            FROM          F33 AS F33_3 INNER JOIN
                                                   mVersion AS mVersion_3 ON F33_3.VersionID = mVersion_3.VersionID INNER JOIN
                                                   OrgSpr AS OrgSpr_3 ON mVersion_3.Period = OrgSpr_3.Period AND 
                                                   mVersion_3.BusinessProcessID = OrgSpr_3.BusinessProcessID
                            WHERE      (mVersion_3.Period = @fPeriod) AND (F33_3.FiscalActivities = 0100) AND (F33_3.PeriodType = 02)) AS t4 ON 
                      t3.OriginalName = t4.OriginalName FULL OUTER JOIN
                          (SELECT     OrgSpr_4.OriginalName, F33_4.Sum
                            FROM          F33 AS F33_4 INNER JOIN
                                                   mVersion AS mVersion_4 ON F33_4.VersionID = mVersion_4.VersionID INNER JOIN
                                                   OrgSpr AS OrgSpr_4 ON mVersion_4.Period = OrgSpr_4.Period AND 
                                                   mVersion_4.BusinessProcessID = OrgSpr_4.BusinessProcessID
                            WHERE      (mVersion_4.Period = @fPeriod) AND (F33_4.FiscalActivities = 010) AND (F33_4.PeriodType = 01)) AS t5 ON 
                      t4.OriginalName = t5.OriginalName FULL OUTER JOIN
                          (SELECT     OrgSpr_5.OriginalName, F33_5.Sum
                            FROM          F33 AS F33_5 INNER JOIN
                                                   mVersion AS mVersion_5 ON F33_5.VersionID = mVersion_5.VersionID INNER JOIN
                                                   OrgSpr AS OrgSpr_5 ON mVersion_5.Period = OrgSpr_5.Period AND 
                                                   mVersion_5.BusinessProcessID = OrgSpr_5.BusinessProcessID
                            WHERE      (mVersion_5.Period = @fPeriod) AND (F33_5.FiscalActivities = 010) AND (F33_5.PeriodType = 02)) AS t6 ON 
                      t5.OriginalName = t6.OriginalName FULL OUTER JOIN
                          (SELECT     OrgSpr_6.OriginalName, F33_6.Sum
                            FROM          F33 AS F33_6 INNER JOIN
                                                   mVersion AS mVersion_6 ON F33_6.VersionID = mVersion_6.VersionID INNER JOIN
                                                   OrgSpr AS OrgSpr_6 ON mVersion_6.Period = OrgSpr_6.Period AND 
                                                   mVersion_6.BusinessProcessID = OrgSpr_6.BusinessProcessID
                            WHERE      (mVersion_6.Period = @fPeriod) AND (F33_6.FiscalActivities = 080) AND (F33_6.PeriodType = 01)) AS t7 ON 
                      t6.OriginalName = t7.OriginalName FULL OUTER JOIN
                          (SELECT     OrgSpr_7.OriginalName, F33_7.Sum
                            FROM          F33 AS F33_7 INNER JOIN
                                                   mVersion AS mVersion_7 ON F33_7.VersionID = mVersion_7.VersionID INNER JOIN
                                                   OrgSpr AS OrgSpr_7 ON mVersion_7.Period = OrgSpr_7.Period AND 
                                                   mVersion_7.BusinessProcessID = OrgSpr_7.BusinessProcessID
                            WHERE      (mVersion_7.Period = @fPeriod) AND (F33_7.FiscalActivities = 080) AND (F33_7.PeriodType = 01)) AS t8 ON 
                      t7.OriginalName = t8.OriginalName
WHERE     (NOT (t1.OriginalName IS NULL))
ORDER BY N1

Спасибо
16 ноя 09, 11:24    [7932509]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь по написанию запоса  [new]
Taffy
Member

Откуда:
Сообщений: 20498
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 = 010 AND f.PeriodType = 01
		  then f.sum else 0 end)
	- 
	    (case when t.id=2 and f.FiscalActivities = 010 AND f.PeriodType = 02
		  then f.sum else 0 end) 
	+
	    (case when t.id=2 and f.FiscalActivities = 080 AND f.PeriodType = 01
		  then f.sum else 0 end) 
	- 
	    (case when t.id=2 and f.FiscalActivities = 080 AND f.PeriodType = 02
		  then f.sum else 0 end)) AS S3
FROM      @t t inner join
	mVersion m ON t.period = m.Period
	F33 f INNER JOIN f.VersionID = m.VersionID INNER JOIN
            OrgSpr o ON m.Period = o.Period AND v.BusinessProcessID = o.BusinessProcessID
group by o.OriginalName
16 ноя 09, 12:13    [7932952]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь по написанию запоса  [new]
Ozzy-Osbourne
Member

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

из того, что нарисовано ниже этой фразы:
автор
А в дальнейшем я в Reporting Services получаю отчет (справа и снизу обрежу т к она большая)
- я понял, что Вам надо транспонировать строки в столбцы.
Индекс "Stolbzi" пробегает значения от 1 до 5
Индекс "Stroki" - фиксированный набор значений ( [0010],[0020],[0030],[0040],[0050],[0060],[0070],[0080],[0081],[0090],[0100] ).
Что касается года, то я не понял, почему от 2005 вы "приклеиваете" только одно значение, а не все.
В общем, вот ПРЕДПОЛАГАЕМЫЙ вариант запроса и итога, но только за 2006 год (колонки для значения "Stolbzi" = 1 имеют префикс "1:", для значения 2 - префикс "2:" и т.п.):
1) test data:
+
declare @t table(nm varchar(100),cols char(1), rows char(4), xsum int, period char(6))
insert @t select 'Балашихинское Райпо',	1,'0100',11640,200512
insert @t select 'Балашихинское Райпо',	2,'0100',2495,200512
insert @t select 'Балашихинское Райпо',	1,'0010',4956,200612
insert @t select 'Балашихинское Райпо',	2,'0010',	0,200612
insert @t select 'Балашихинское Райпо',	3,'0010',	0,200612
insert @t select 'Балашихинское Райпо',	4,'0010',0,200612
insert @t select 'Балашихинское Райпо',	5,'0010',1,200612
insert @t select 'Балашихинское Райпо',	1,'0020',8,200612
insert @t select 'Балашихинское Райпо',	2,'0020',0,200612
insert @t select 'Балашихинское Райпо',	3,'0020',0,200612
insert @t select 'Балашихинское Райпо',	4,'0020',0,200612
insert @t select 'Балашихинское Райпо',	5,'0020',0,200612
insert @t select 'Балашихинское Райпо',	1,'0030',0,200612
insert @t select 'Балашихинское Райпо',	2,'0030',0,200612
insert @t select 'Балашихинское Райпо',	3,'0030',0,200612
insert @t select 'Балашихинское Райпо',	4,'0030',0,200612
insert @t select 'Балашихинское Райпо',	5,'0030',0,200612
insert @t select 'Балашихинское Райпо',	1,'0040',0,200612
insert @t select 'Балашихинское Райпо',	2,'0040',0,200612
insert @t select 'Балашихинское Райпо',	3,'0040',0,200612
insert @t select 'Балашихинское Райпо',	4,'0040',0,200612
insert @t select 'Балашихинское Райпо',	5,'0040',0,200612
insert @t select 'Балашихинское Райпо',	1,'0050',0,200612
insert @t select 'Балашихинское Райпо',	2,'0050',0,200612
insert @t select 'Балашихинское Райпо',	3,'0050',0,200612
insert @t select 'Балашихинское Райпо',	4,'0050',0,200612
insert @t select 'Балашихинское Райпо',	5,'0050',0,200612
insert @t select 'Балашихинское Райпо',	1,'0060',0,200612
insert @t select 'Балашихинское Райпо',	2,'0060',0,200612
insert @t select 'Балашихинское Райпо',	3,'0060',0,200612
insert @t select 'Балашихинское Райпо',	4,'0060',0,200612
insert @t select 'Балашихинское Райпо',	5,'0060',0,200612
insert @t select 'Балашихинское Райпо',	1,'0070',0,200612
insert @t select 'Балашихинское Райпо',	2,'0070',0,200612
insert @t select 'Балашихинское Райпо',	3,'0070',0,200612
insert @t select 'Балашихинское Райпо',	4,'0070',0,200612
insert @t select 'Балашихинское Райпо',	5,'0070',0,200612
insert @t select 'Балашихинское Райпо',	1,'0080',2653,200612
insert @t select 'Балашихинское Райпо',	2,'0080',0,200612
insert @t select 'Балашихинское Райпо',	3,'0080',0,200612
insert @t select 'Балашихинское Райпо',	4,'0080',0,200612
insert @t select 'Балашихинское Райпо',	5,'0080',0,200612
insert @t select 'Балашихинское Райпо',	1,'0081',11737,200612
insert @t select 'Балашихинское Райпо',	2,'0081',0,200612
insert @t select 'Балашихинское Райпо',	3,'0081',0,200612
insert @t select 'Балашихинское Райпо',	4,'0081',0,200612
insert @t select 'Балашихинское Райпо',	5,'0081',0,200612
insert @t select 'Балашихинское Райпо',	1,'0090',859,200612
insert @t select 'Балашихинское Райпо',	2,'0090',0,200612
insert @t select 'Балашихинское Райпо',	3,'0090',0,200612
insert @t select 'Балашихинское Райпо',	4,'0090',0,200612
insert @t select 'Балашихинское Райпо',	5,'0090',0,200612
insert @t select 'Балашихинское Райпо',	1,'0100',20213,200612
insert @t select 'Балашихинское Райпо',	2,'0100',0,200612
insert @t select 'Балашихинское Райпо',	3,'0100',0,200612
insert @t select 'Балашихинское Райпо',	4,'0100',0,200612
insert @t select 'Балашихинское Райпо',	5,'0100',1,200612

--Волоколамское Райпо	8081	0	688		0	836	0	0	0	9288	113	0	10925	7171	7806	18	0	603	0	0	841	0	0	144	9412
insert @t select 'Волоколамское Райпо',	1,'0010',0,200612
insert @t select 'Волоколамское Райпо',	1,'0020',688,200612
insert @t select 'Волоколамское Райпо',	1,'0030',0  ,200612
insert @t select 'Волоколамское Райпо',	1,'0040',836,200612
insert @t select 'Волоколамское Райпо',	1,'0050',0  ,200612
insert @t select 'Волоколамское Райпо',	1,'0060',0  ,200612
insert @t select 'Волоколамское Райпо',	1,'0070',0  ,200612
insert @t select 'Волоколамское Райпо',	1,'0080',9288,200612
insert @t select 'Волоколамское Райпо',	1,'0081',113,200612
insert @t select 'Волоколамское Райпо',	1,'0090',0,200612
insert @t select 'Волоколамское Райпо',	1,'0100',10925,200612

insert @t select 'Волоколамское Райпо',	2,'0010',7806,200612
insert @t select 'Волоколамское Райпо',	2,'0020',18,200612
insert @t select 'Волоколамское Райпо',	2,'0030',0  ,200612
insert @t select 'Волоколамское Райпо',	2,'0040',603,200612
insert @t select 'Волоколамское Райпо',	2,'0050',0  ,200612
insert @t select 'Волоколамское Райпо',	2,'0060',0  ,200612
insert @t select 'Волоколамское Райпо',	2,'0070',841,200612
insert @t select 'Волоколамское Райпо',	2,'0080',0,200612
insert @t select 'Волоколамское Райпо',	2,'0081',0,200612
insert @t select 'Волоколамское Райпо',	2,'0090',144,200612
insert @t select 'Волоколамское Райпо',	2,'0100',9412,200612

2) query:
;with
a as
(
select nm,cols,rows,xsum,period ,c=cols+rows
from @t
where period='200612'
)
select nm
,[1:0010]=isNull(max([10010]), ''),[1:0020]=isNull(max([10020]), ''),[1:0030]=isNull(max([10030]), ''),[1:0040]=isNull(max([10040]), ''),[1:0050]=isNull(max([10050]), ''),[1:0060]=isNull(max([10060]), ''),[1:0070]=isNull(max([10070]), ''),[1:0080]=isNull(max([10080]), ''),[1:0081]=isNull(max([10081]), ''),[1:0090]=isNull(max([10090]), ''),[1:0100]=isNull(max([10100]),'')
,[2:0010]=isNull(max([20010]), ''),[2:0020]=isNull(max([20020]), ''),[2:0030]=isNull(max([20030]), ''),[2:0040]=isNull(max([20040]), ''),[2:0050]=isNull(max([20050]), ''),[2:0060]=isNull(max([20060]), ''),[2:0070]=isNull(max([20070]), ''),[2:0080]=isNull(max([20080]), ''),[2:0081]=isNull(max([20081]), ''),[2:0090]=isNull(max([20090]), ''),[2:0100]=isNull(max([20100]),'')
,[3:0010]=isNull(max([30010]), ''),[3:0020]=isNull(max([30020]), ''),[3:0030]=isNull(max([30030]), ''),[3:0040]=isNull(max([30040]), ''),[3:0050]=isNull(max([30050]), ''),[3:0060]=isNull(max([30060]), ''),[3:0070]=isNull(max([30070]), ''),[3:0080]=isNull(max([30080]), ''),[3:0081]=isNull(max([30081]), ''),[3:0090]=isNull(max([30090]), ''),[3:0100]=isNull(max([30100]),'')
,[4:0010]=isNull(max([40010]), ''),[4:0020]=isNull(max([40020]), ''),[4:0030]=isNull(max([40030]), ''),[4:0040]=isNull(max([40040]), ''),[4:0050]=isNull(max([40050]), ''),[4:0060]=isNull(max([40060]), ''),[4:0070]=isNull(max([40070]), ''),[4:0080]=isNull(max([40080]), ''),[4:0081]=isNull(max([40081]), ''),[4:0090]=isNull(max([40090]), ''),[4:0100]=isNull(max([40100]),'')
,[5:0010]=isNull(max([50010]), ''),[5:0020]=isNull(max([50020]), ''),[5:0030]=isNull(max([50030]), ''),[5:0040]=isNull(max([50040]), ''),[5:0050]=isNull(max([50050]), ''),[5:0060]=isNull(max([50060]), ''),[5:0070]=isNull(max([50070]), ''),[5:0080]=isNull(max([50080]), ''),[5:0081]=isNull(max([50081]), ''),[5:0090]=isNull(max([50090]), ''),[5:0100]=isNull(max([50100]),'')
from a

pivot(
max(xsum) for c in
  (
    [10010],[10020],[10030],[10040],[10050],[10060],[10070],[10080],[10081],[10090],[10100],
    [20010],[20020],[20030],[20040],[20050],[20060],[20070],[20080],[20081],[20090],[20100],
    [30010],[30020],[30030],[30040],[30050],[30060],[30070],[30080],[30081],[30090],[30100],
    [40010],[40020],[40030],[40040],[40050],[40060],[40070],[40080],[40081],[40090],[40100],
    [50010],[50020],[50030],[50040],[50050],[50060],[50070],[50080],[50081],[50090],[50100]
  )
)p
group by nm
3) result (ужос):
+
nm1:00101:00201:00301:00401:00501:00601:00701:00801:00811:00901:01002:00102:00202:00302:00402:00502:00602:00702:00802:00812:00902:01003:00103:00203:00303:00403:00503:00603:00703:00803:00813:00903:01004:00104:00204:00304:00404:00504:00604:00704:00804:00814:00904:01005:00105:00205:00305:00405:00505:00605:00705:00805:00815:00905:0100
Балашихинское Райпо49568000002653117378592021300000000000000000000000000000000010000000001
Волоколамское Райпо068808360009288113010925780618060300841001449412000000000000000000000000000000000

PS. Что именно следует делать с 2005 - так и не понял. В общем, попробуйте в качестве прототипа.
16 ноя 09, 13:18    [7933458]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь по написанию запоса  [new]
Demonoid75
Member

Откуда:
Сообщений: 43
Ozzy-Osbourne,

С помощью запроса я получаю таблицу (большой запрос выше):
             N1	         S1	  S2	 S3
Hогинское Горпо	        5998	5122	0
Hогинское Райпо	        5190	3958	2292
Балашихинское Райпо	9145	20213	4956
Видновское Горпо	2864	2536	2137
Волоколамское Райпо	910	1513	-7806
Воскресенское Райпо	7031	13878	15937

Где N1 - перечисляются организации
S1 - (число из 0100 строки, 01 стобца за СООТВ.ПРОШЛОГО ГОДА) минус (число из 0100 строки, 02 стобца за СООТВ.ПРОШЛОГО ГОДА)
S2 - (число из 0100 строки, 01 стобца за ТЕКУЩИЙ ГОД) минус (число из 0100 строки, 02 стобца за ТЕКУЩИЙ ГОД)

При выполнении запроса требуется ввести год (@fPeriod)
16 ноя 09, 13:36    [7933618]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь по написанию запоса  [new]
Ozzy-Osbourne
Member

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

а сколько (максимум) "годов назад" надо отработать (S1,S2,S3,...) ? заранее это число известно или нет ?
16 ноя 09, 13:40    [7933654]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь по написанию запоса  [new]
Demonoid75
Member

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

а сколько (максимум) "годов назад" надо отработать (S1,S2,S3,...) ? заранее это число известно или нет ?


В базе данные с 2000 года.
Они вносятся за квартал: 200003, 200006, 200009, 200012 .... 200712
При запросе например вводятся период 200612, но первый столбец рассчитывается за 200512, что (СООТВ.ПРОШЛОГО ГОДА)
16 ноя 09, 14:12    [7933962]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь по написанию запоса  [new]
Demonoid75
Member

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

Спасибо за интересный способ написания запроса, но выскакивает ошибка:

Конструкция или оператор SQL объявить курсор не поддерживается
Необходимо объявить скалярную переменную “@fPeriod ”
Неправильный синтаксис около “F33”

И если задать “@fPeriod ” значением, то остается ошибка:

Неправильный синтаксис около “F33”
16 ноя 09, 14:35    [7934173]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь по написанию запоса  [new]
Taffy
Member

Откуда:
Сообщений: 20498
а версию сервера Вы не озвучили?
похоже у Вас 2000, в котором еще нет табличных переменных
ну и джойн я один пропустила - Вы же не опубликовали вопрос согласно правил (с кодом создания таблиц и вставки в них тестовых данных)

create table #t(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 = '010' AND f.PeriodType = '01'
		  then f.sum else 0 end)
	- 
	    (case when t.id=2 and f.FiscalActivities = '010' AND f.PeriodType = '02'
		  then f.sum else 0 end) 
	+
	    (case when t.id=2 and f.FiscalActivities = '080' AND f.PeriodType = '01'
		  then f.sum else 0 end) 
	- 
	    (case when t.id=2 and f.FiscalActivities = '080' AND f.PeriodType = '02'
		  then f.sum else 0 end)) AS S3
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 v.BusinessProcessID = o.BusinessProcessID
group by o.OriginalName
16 ноя 09, 15:02    [7934435]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь по написанию запоса  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Taffy
а версию сервера Вы не озвучили?
похоже у Вас 2000, в котором еще нет табличных переменных
Табличные переменные появились как раз в SQL 2000
16 ноя 09, 15:07    [7934476]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь по написанию запоса  [new]
Taffy
Member

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

ну да?
склероз, сорри

да и у ТС дело не в табличных переменых было, а в том что я там джойны переделывала и допустила синтаксическую обшибку
16 ноя 09, 15:16    [7934541]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь по написанию запоса  [new]
Ozzy-Osbourne
Member

Откуда: Balashikha
Сообщений: 139
Demonoid75
Ozzy-Osbourne
Demonoid75,

а сколько (максимум) "годов назад" надо отработать (S1,S2,S3,...) ? заранее это число известно или нет ?


В базе данные с 2000 года.
Они вносятся за квартал: 200003, 200006, 200009, 200012 .... 200712
При запросе например вводятся период 200612, но первый столбец рассчитывается за 200512, что (СООТВ.ПРОШЛОГО ГОДА)
тогда для вычислений S1,S2,S3 etc попробуйте примерно так (для периода max=10 лет):
1) test data:
+
declare @t table(nm varchar(100),cols char(1), rows char(4), xsum int, period char(6))

insert @t select 'Балашихинское Райпо',	1,'0100',11640,200412
insert @t select 'Балашихинское Райпо',	2,'0100',12495,200412

insert @t select 'Балашихинское Райпо',	1,'0100',23015,200312
insert @t select 'Балашихинское Райпо',	2,'0100',22067,200312

insert @t select 'Балашихинское Райпо',	1,'0100',28633,200212
insert @t select 'Балашихинское Райпо',	2,'0100',22495,200212

insert @t select 'Балашихинское Райпо',	1,'0100',21641,200112
insert @t select 'Балашихинское Райпо',	2,'0100',24395,200112

insert @t select 'Балашихинское Райпо',	1,'0100',18940,200012
insert @t select 'Балашихинское Райпо',	2,'0100',20347,200012

insert @t select 'Балашихинское Райпо',	1,'0100',11640,200512
insert @t select 'Балашихинское Райпо',	2,'0100',13547,200512

insert @t select 'Балашихинское Райпо',	1,'0100',21640,200509
insert @t select 'Балашихинское Райпо',	2,'0100',21775,200509

insert @t select 'Балашихинское Райпо',	1,'0100',15566,200506
insert @t select 'Балашихинское Райпо',	2,'0100',17778,200506

insert @t select 'Балашихинское Райпо',	1,'0100',13322,200503
insert @t select 'Балашихинское Райпо',	2,'0100',17799,200503
--------------------------------------------------------------
insert @t select 'Волоколамское Райпо',	1,'0100',11111,200412
insert @t select 'Волоколамское Райпо',	2,'0100',15555,200412
insert @t select 'Волоколамское Райпо',	1,'0100',11111,200312
insert @t select 'Волоколамское Райпо',	2,'0100',15555,200312
insert @t select 'Волоколамское Райпо',	1,'0100',11111,200212
insert @t select 'Волоколамское Райпо',	2,'0100',15555,200212
insert @t select 'Волоколамское Райпо',	1,'0100',11111,200112
insert @t select 'Волоколамское Райпо',	2,'0100',15555,200112
insert @t select 'Волоколамское Райпо',	1,'0100',11111,200012
insert @t select 'Волоколамское Райпо',	2,'0100',15555,200012

insert @t select 'Волоколамское Райпо',	1,'0100',11111,200512
insert @t select 'Волоколамское Райпо',	2,'0100',15555,200512

insert @t select 'Волоколамское Райпо',	1,'0100',13333,200509
insert @t select 'Волоколамское Райпо',	2,'0100',19999,200509

insert @t select 'Волоколамское Райпо',	1,'0100',15252,200506
insert @t select 'Волоколамское Райпо',	2,'0100',17678,200506

insert @t select 'Волоколамское Райпо',	1,'0100',14526,200503
insert @t select 'Волоколамское Райпо',	2,'0100',11171,200503

2) query:
declare @p char(6)
set @p='200512'
;with
n as
(select i=0 union all select 1 union all select 2 union all select 3 union all select 4 
     union all select 5 union all select 6 union all select 7 union all select 8 union all select 9
)
,p as
(select px=@p,i,d=convert(char(6), dateadd(year,-i,cast(@p+'01' as datetime)), 112)
   from n
)
select px,nm,
 s0=isNull( sum([0]), 0)
,s1=isNull( sum([1]), 0)
,s2=isNull( sum([2]), 0)
,s3=isNull( sum([3]), 0)
,s4=isNull( sum([4]), 0)
,s5=isNull( sum([5]), 0)
,s6=isNull( sum([6]), 0)
,s7=isNull( sum([7]), 0)
,s8=isNull( sum([8]), 0)
,s9=isNull( sum([9]), 0)
from(
select p.px,i,t.nm,p.d,s=sum(t.xsum)
from p
join @t t on t.rows='0100' and t.cols in(1,2) and p.d=t.period
group by p.px,i,t.nm,p.d
)z
pivot(sum(s) for i in([0],[1],[2],[3],[4],[5],[6],[7],[8],[9]))pv
group by px,nm
3) result:
pxnms0s1s2s3s4s5s6s7s8s9
200512Балашихинское Райпо2518724135450825112846036392870000
200512Волоколамское Райпо2666626666266662666626666266660000

После чего соедините с запросом, в котором идёт детализация по cols = 0010, 0020 etc (я его выше приводил) по условию равенства названий ваших сельпо.
Но из конечного резалтсета придётся выкидывать лишние графы. А раз число их зависит от того, что ввёдет юзер, то это, видимо, должно делать клиентское приложение.
16 ноя 09, 15:16    [7934544]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь по написанию запоса  [new]
Demonoid75
Member

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

Да извиняюсь, сервер не озвучил.
Было все на SQL 2000, но уже перенес на SQL 2005 т. к. возникла необходимость в Reporting Services.
16 ноя 09, 16:11    [7934990]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь по написанию запоса  [new]
Demonoid75
Member

Откуда:
Сообщений: 43
Огромное спасибо всем за помощь...
Но особенно
Taffy,
взял твой вариант за основу, он мне более понятен и в отличии от моего варианта не отсекает NULL значения...

Еще раз спасибо!!!!
17 ноя 09, 13:00    [7939092]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить