Параметры в Pivot - PullRequest
       2

Параметры в Pivot

0 голосов
/ 02 мая 2019

У меня есть задача отправить список центров затрат (varchar) на запрос, и запрос должен предоставлять данные, основанные на каждом входе.

У меня нет понимания динамического SQL.

Итак, у меня есть список учетных центров, таких как 88115100, 88115200, 88115300 ...... около 30.

declare @month integer

declare @month_2 integer
declare @startdate datetime
declare @enddate datetime
declare @costcenter varchar(20)

set @month_2= 3--/* t3.finncPriod=*/ '[%0]'
set @month=@month_2-1
set @costcenter='88115100'
set @startdate= '03/01/2019'--/*t0.docdate from oinm t0 where t0.docdate>=*/'[%1]'
set @enddate= '03/31/2019'--/*t0.docdate from oinm t0 where t0.docdate>=*/'[%2]'

select * from
(
    select
        t0.name+'-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
        t0.name + '-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
    ([88115100-Budget], [88115100-Actual])
)
as pivottable

1 Ответ

0 голосов
/ 03 мая 2019

Хорошо, так что из того, что я могу сказать, вы, вероятно, хотите хранимую процедуру , и вы предполагаете, что она может / должна быть динамическим 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'

Отказ от ответственности: я не могу быть обеспокоен тестированием синтаксиса больше, чем с помощью встроенной подсветки синтаксиса, поскольку это потребует создания новой базы данных и множества новых объектов, поэтому извините, если там есть какие-либо опечатки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...