powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Отчетные системы [игнор отключен] [закрыт для гостей] / Динамический перекрестный запрос
11 сообщений из 11, страница 1 из 1
Динамический перекрестный запрос
    #35575113
вопросец
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сделал вот такой вот динамический запрос. Подскажите, пожалуйста, как мне представить результат в виде таблицы или представления? Проблема в том, что мне нужно на основе результатов этого запроса сделать отчет в Reporting Server, а он такие навороты t-sql не понимает

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
declare @name nvarchar( 100 )
	declare @id int
	declare @sql_1 nvarchar( 1000 )
	declare @sql_2 nvarchar( 1000 )

	declare cur cursor
	for select distinct oe.oe_name, oe.oe_id from dbo.tOrderElements as oe inner join dbo.tOrder_tOrderElements ooe
	on oe.oe_id = ooe.oe_id

	open cur
	fetch next from cur into @name, @id

	while @@fetch_status =  0 
		begin
			if @sql_1 != ''
				begin
					set @sql_1 = @sql_1 + ', ' + '[' + cast(@id as nvarchar( 20 )) + ']'
				end
			else
				begin
					set @sql_1 = '[' + cast(@id as nvarchar( 20 )) + ']'
				end
			if @sql_2 != ''
				begin
					set @sql_2 = @sql_2 + ', ' + 'max([' + cast(@id as nvarchar( 20 )) + ']) as ' + '[' + @name + ']'
				end
			else
				begin
					set @sql_2 = 'max([' + cast(@id as nvarchar( 20 )) + ']) as ' + '[' + @name + ']'
				end
			
			fetch next from cur into @name, @id
		end
	close cur
	deallocate cur

	exec ( '
	select o_id, o_numb as [Номер заказа], o_date_2 as [Дата доставки], ' + @sql_2 + '
	from 

	(select o.o_id, o.o_numb, cast(o.o_date_2 as nvarchar(10)) as o_date_2, ooe.ooe_qty, oe.oe_id, cast(oe.oe_salary_1 as nvarchar(20)) + 
	case when ooe.ooe_qty is not null and ooe.ooe_qty != 0 then '' ('' + cast(ooe.ooe_qty as nvarchar(10)) + '')'' else '''' end as oe_salary_1 from
	dbo.tOrder_tOrderElements as ooe inner join dbo.tOrderElements as oe on ooe.oe_id = oe.oe_id inner join dbo.tOrder as o on o.o_id = ooe.o_id) as t

	pivot (max(oe_salary_1) for oe_id in (' + @sql_1 + ')) as pvt
	group by o_id, o_date_2, o_numb
	order by o_id, o_date_2')
...
Рейтинг: 0 / 0
Динамический перекрестный запрос
    #35575125
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВопросецСделал вот такой вот динамический запрос. Подскажите, пожалуйста, как мне представить результат в виде таблицы или представления?
Никак. Таблица - это физический объект с заранее определенной структурой. А представление - это запрос, а не скрипт
...
Рейтинг: 0 / 0
Динамический перекрестный запрос
    #35575131
вопросец
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Подскажите тогда, пожалуйста, какие есть варианты решения этой задачи?
...
Рейтинг: 0 / 0
Динамический перекрестный запрос
    #35575139
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВопросецПодскажите тогда, пожалуйста, какие есть варианты решения этой задачи?
Какой этой ?
Задачу получения перекрестного запроса вы уже решили
...
Рейтинг: 0 / 0
Динамический перекрестный запрос
    #35575224
вопросец
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мне нужно сделать этот запрос источником данных для отчета в Reporting Server. Там выдается ошибка: 'There is an error in the query. Incorrect syntax near the keyword 'from'.
Incorrect syntax near the keyword 'as'.'
...
Рейтинг: 0 / 0
Динамический перекрестный запрос
    #35575339
IamZet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
RS действительно не шибко силен по части сложных запросов. Поэтому, я обычно все запросы сложнее тривиальных select оформляю как процедуры или функции с набором параметров на входе и таблицей на выходе. Соответственно, в data source отчета пишется select к функции либо exec процедуры.
...
Рейтинг: 0 / 0
Динамический перекрестный запрос
    #35576549
Ghola
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
+1 к IamZet
Хотя лично я отдаю предпочтение функциям. Хранимые процедуры сейчас в основном применяются для модификации данных. За единственным исключением - необходимостью применения в процессе генерации результирующей выборки временных таблиц. В функциях вместо временных таблиц используются табличные переменные, однако по сранению с временными таблицами они имеют некоторые недостатки при повторных обращених на очень больших объёмах данных.
...
Рейтинг: 0 / 0
Динамический перекрестный запрос
    #35606178
Nikola18
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Приведённый ниже скоипт у меня в отчётах находится на закладке DATA и совершенно нормально отрабатывает, возвращая полноценную таблицу.
Однако сейчас я пытаюсь сделать что-то подобное для Oracle DB, а вот с ним возникают трудности.
_______________________________________________________
declare @SQL_String varchar(max);
declare @SQL_Join varchar(max);
declare @SQL_Where varchar(max);
declare @SQL_Group varchar(max);
declare @SQL_From varchar(100);
declare @SQL_To varchar(100);
declare @SQL_Series varchar(150);
declare @SQL_Inners varchar(150);

set @SQL_Join = '';
set @SQL_Where = '';

if (@sWellsID is not Null and @sWellsID <>'NULL')
or (@sPUID is not Null and @sPUID <>'NULL')
or (@sFieldsID is not Null and @sFieldsID <>'NULL')
or (@sPadsID is not Null and @sPadsID <>'NULL')
or (@sWellSetID is not Null and @sWellSetID<>'NULL')
begin
set @SQL_Join = @SQL_Join +' inner join WellStates WS on (WS.ID = JB.WellStateID)';
if (@sWellsID is not Null and @sWellsID <>'NULL') set @SQL_Where = @SQL_Where + ' and (WS.WellID in ('+@sWellsID +'))';
if (@sPUID is not Null and @sPUID <>'NULL')
or (@sFieldsID is not Null and @sFieldsID <>'NULL')
or (@sPadsID is not Null and @sPadsID <>'NULL')
or (@sWellSetID is not Null and @sWellSetID<>'NULL')
begin
set @SQL_Join = @SQL_Join +' inner join Wells WL on (WL.ID = WS.WellID)';
if @sPUID is not Null and @sPUID <>'NULL' set @SQL_Where = @SQL_Where + ' and (WL.PUID in ('+@sPUID +'))';
if @sFieldsID is not Null and @sFieldsID <>'NULL' set @SQL_Where = @SQL_Where + ' and (WL.FieldID in ('+@sFieldsID+'))';
if @sPadsID is not Null and @sPadsID <>'NULL' set @SQL_Where = @SQL_Where + ' and (WL.PadID in ('+@sPadsID +'))';
if @sWellSetID is not Null and @sWellSetID<>'NULL' begin
set @SQL_Join = @SQL_Join + ' inner join WellSetToWell WSW on WSW.WellID = WL.ID';
set @SQL_Where = @SQL_Where + ' and (WSW.WellSetID in ('+@sWellSetID+'))';
end;
end;
end;

if @sOperationTypesID is not Null and @sOperationTypesID<>'NULL'
set @SQL_Where = @SQL_Where + ' and (JB.OperationTypeID in ('+@sOperationTypesID+'))';
;

if @sFMID is not Null and @sFMID<>'NULL' begin
set @SQL_Join = @SQL_Join + ' inner join FM_Modules FMM on FMM.ID = JB.FM_ModuleID';
set @SQL_Where = @SQL_Where + ' and (FMM.FMID in ('+@sFMID+'))';
end;


set @SQL_From = 'convert(datetime, '''+@dDateFrom+''')';
set @SQL_To = 'convert(datetime, '''+@dDateTo +''')';

if @sGroupingID is not Null and @sGroupingID<>'NULL' begin
select
@SQL_Series = IsNull(Field_Sentence, '''''')
, @SQL_Inners = IsNull(Inner_Sentence, '''''')
from Sorting
where ID = @sGroupingID;
select @SQL_Series = replace(@SQL_Series, '%jobdate%', 'max(JO.EndDate)');
-- replace(@SQL_Inners, '%jobdate%', 'max(JO.EndDate)');
end
else begin
set @SQL_Series = '''''';
set @SQL_Inners = '''''';
end;


set @SQL_String = '
-- Объявление таблицы для заполнения долларом на баррель
declare @Scorpion table (
RecNum Integer
, SeriesText varchar(100) -- Текст, разграничивающий данные по сериям
, OrdersText varchar(100) -- Текст, определяющий порядок точек в серии
, Cost float -- Стоимость данного мероприятия
, IOV float -- ДД данного мероприятия
, cCost float -- Накопленная стоимость в порядке OrdersText
, cIOV float -- Накопленная ДД в порядке OrdersText
, COSTperIOV float -- Удельная стоимость (для упорядочивания)
);

insert into @Scorpion
select ROW_NUMBER() over (order by
'+@SQL_Series+'
, sign(case when JI.Oil is Null then 0 else JI.Oil end) DESC
, case when (JI.Oil is Null) or (JI.Oil=0) then sum(JO."Sum") else sum(JO."Sum")/JI.Oil end
, JB.ID)
, '+@SQL_Series+'
, convert(varchar(100), JB.ID)
, sum(dbo.GetMoney(JO."Sum", JO.SumCurrencyID, '+@sCurrenciesID+', JO.EndDate))
, case
when JI.Oil is Null then 0 else /*case
when abs(JI.Oil)>10000000 then sign(JI.Oil)*10000000 else*/ JI.Oil /*end */
end
, convert(float, 0)
, convert(float, 0)
, case when (JI.Oil is Null) or (JI.Oil=0) then Null else sum(JO."Sum")/JI.Oil end
from Jobs JB
inner join OperationTypes OT on (OT.ID = JB.OperationTypeID)
inner join JobOperations JO on (JO.JobID = JB.ID)
'+@SQL_Join+'
inner join Job_FCs JFC on (JFC.JobID = JB.ID) and (JFC.FC_TypeID = '+@sFC_TypesID+') and (JFC.KLevel = OT.TypeLevel)
left join Job_IOR JI on (JI.Job_FCID = JFC.ID) and (JI.PeriodID = '+@sPeriod_IORID+')
where (0=0)
'+@SQL_Where+'
group by JB.ID, JI.Oil
having (max(JO.EndDate) >= '+@SQL_From+') and (max(JO.EndDate) < '+@SQL_To+')
order by 1
-- '+@SQL_Series+'
-- , sign(case when JI.Oil is Null then 0 else JI.Oil end) DESC
-- , case when (JI.Oil is Null) or (JI.Oil=0) then sum(JO."Sum") else sum(JO."Sum")/JI.Oil end
-- , JB.ID
;

declare @CD float;
declare @CB float;
declare @ST varchar(100);
set @CD = 0;
set @CB = 0;
set @ST = '''';

update @Scorpion
set @CD = cCost = isnull(Cost, 0) + case when @ST = SeriesText then isnull(@CD, 0) else 0 end
, @CB = cIOV = isnull(IOV, 0) + case when @ST = SeriesText then isnull(@CB, 0) else 0 end
, @ST = SeriesText
;

insert into @Scorpion (RecNum, SeriesText, cCost, cIOV)
select distinct 0, SeriesText, 0, 0
from @Scorpion;

select SeriesText, OrdersText, cIOV as "CumIOV", cCost as "CumCost"
from @Scorpion
order by SeriesText, RecNum, OrdersText;
'
;

exec(@SQL_String);
...
Рейтинг: 0 / 0
Динамический перекрестный запрос
    #35606439
Ghola
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Оформите ваш T-SQL пакет как табличную функцию либо хранимую процедуру - и указывайте в датасете запроса обращение к этой хранимой функции или процедуре. По возможности рекомендую предпочитать функции, поскольку они "легче".
...
Рейтинг: 0 / 0
Динамический перекрестный запрос
    #35606455
Ghola
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
*(поправка, в датасете отчета

Следует избегать сложных SQL-запросов в датасетах отчетов. "Это - неправильно"(с) :)

Это неоптимально посколько такие запросы каждый раз перекомпилируются и строится план их выполнения. Лучше сделать функцию - она компилируется один раз и после этого хранится на SQL-сервере.
...
Рейтинг: 0 / 0
Динамический перекрестный запрос
    #35606461
Ghola
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Поскольку Вы используете динамический SQL, то придётся писать хранимую процедуру. В функциях он запрещён.
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Отчетные системы [игнор отключен] [закрыт для гостей] / Динамический перекрестный запрос
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]