Хорошо, так что из того, что я могу сказать, вы, вероятно, хотите хранимую процедуру , и вы предполагаете, что она может / должна быть динамическим SQL. Теперь вы можете сделать это, но единственное время, когда вам нужен динамический SQL, это когда вам приходится переписывать ключевые слова в зависимости от переменных. Вам придется сделать это с указанным выше кодом, в частности, со следующим битом:
pivot
(
sum(a.value)
for a.topivot in
([88115100-Budget], [88115100-Actual])
)
Это потому, что [88115100-Budget]
и [88115100-Actual]
являются ключевыми словами, которые зависят от вашей переменной (@costcenter
). Но нет никаких причин, чтобы их так называли в SQL! Тебе гораздо лучше применять эти имена позже, во всех случаях, когда ты отправляешь эти данные за пределы SQL.
Вместо этого вы, вероятно, хотите что-то вроде следующего кода:
CREATE PROCEDURE GetBudgetForCostCenter
@month integer = 2,
@month_2 integer = 3,
@startdate datetime = '03/01/2019',
@enddate datetime = '03/31/2019',
@costcenter varchar(20) = '88115100'
--you probably don't actually want the default values in here, but I've left them for demonstration.
AS
BEGIN
select * from
(
select
'Budget' as 'toPivot',
t4.AcctCode as 'GLAccount',
t4.AcctName,
isnull(t2.DebLTotal,0) as 'value'
from obgs as t0
inner join obgt as t1 on t0.AbsId = t1.Instance
inner join bgt1 as t2
on t2.Instance = t1.Instance
and t2.AcctCode = t1.AcctCode
and t2.Line_ID = @month
inner join oact as t4 on t4.AcctCode = t2.AcctCode
where t0.name = @costcenter
union all
select
'Actual'as 't0Pivot',
t4.AcctCode as 'GLAccount',
t4.AcctName,
isnull(sum(debit-credit),0) as 'value'
from jdt1 as t3
left join oact t4 on t4.AcctCode = t3.Account
left join obgs t0 on t0.Name = t3.ProfitCode
left join obgt t1
on t1.Instance = t0.AbsId
and t4.AcctCode = t1.AcctCode
left join bgt1 as t2
on t1.Instance = t2.Instance
and t2.AcctCode = t1.AcctCode
and t2.line_ID = 2
where
t3.refdate between @startdate and @enddate
and t4.ExportCode is not null
and t0.name = @costcenter
group by
t0.name,
t4.AcctCode,
t4.AcctName
) as a
pivot
(
sum(a.value)
for a.topivot in
([Budget], [Actual])
)
as pivottable
END
Обратите внимание, что я изменил ваши столбцы с 88115100-Budget
и 88115100-Actual
на просто Budget
и Actual
. Это означает, что вы можете избежать использования динамического SQL, который вы должны всегда делать.
Теперь его можно вызывать через что-то вроде
exec GetBudgetForCostCenter @month = 2, @month_2 = 3, @startdate = '03/01/2019', @enddate = '03/31/2019', @costcenter = '88115100'
Отказ от ответственности: я не могу быть обеспокоен тестированием синтаксиса больше, чем с помощью встроенной подсветки синтаксиса, поскольку это потребует создания новой базы данных и множества новых объектов, поэтому извините, если там есть какие-либо опечатки.