【发布时间】:2018-12-13 02:56:39
【问题描述】:
我有一个现有代码,我必须向其中添加新参数 - @Depreciation“是”或“否”
如果@Depreciation = 1(我认为这对应于“是”) 那么我希望现有代码的特定条件是 FALSE(我用 '-- ***' 标记了该代码部分),
反之亦然 -
如果@Depreciation = 0('否') 那么我希望代码中的条件是 是的
条件是
(NOT (acct.[GLAccountCode] IN (N'9040',N'9047',N'4130')))
位于下面代码中的第一个 WHERE 之后。
请不要过多关注整个代码。 我必须修改的唯一部分是 - 'DECLARE @Depreciation....' 和 在第一个 'WHERE .....' 之后 - 我标记了 -- ***
DECLARE @FYMonthBOP date = '07-01-2016'
DECLARE @FYMonthEOP date = '07-01-2018'
DECLARE @GLProgramGroupsWHID int = -1
DECLARE @GLProgramsWHID_Groups int = -1
DECLARE @GLProgramGroupSetsWHID int = -1
DECLARE @Depreciation bit = 1 -- *** This is my added Parameter
SELECT
gl0.GLGroupLevel0Name
, gl0.Ordinal AS Ordinal0
, [Dimension].GLGroupLevel1.GLGroupLevel1Name
, [Dimension].GLGroupLevel1.Ordinal AS Ordinal1
, gl2.GLGroupLevel2Name
, gl2.Ordinal AS Ordinal2
, acct.GLAccountCode
, acct.GLAccountName
, setname.WHID AS WHIDGroupSetName
, setname.GroupSetName
, pgm.GLProgramCode + N' ' + pgm.GLProgramName AS Program
, grp.GroupName
, grp.WHID AS WHIDGroupName
, grp.Ordinal AS OrdinalGroupName
, d.FYQuarterLabel AS FQ
, trans.Amount AS Amount
, pgm.[WHID] AS WHIDProgram
, pgm.Ordinal AS OrdinalProgram
, d.FYMonthNumber
, d.FYMonthShortLabel
, d.FYQuarterNumber
, d.FYNumber
, d.FYLabel
, d.YearMonthSort
, IIF(EOMonth(mm.DateThru) < @FYMonthEOP, EOMonth(mm.DateThru),
@FYMonthEOP) AS [DateThru]
FROM
([Dimension].GLGroupLevel2 gl2
INNER JOIN [Dimension].GLAccount acct ON gl2.[WHID] =
acct.GLGroupLevel2FK
INNER JOIN [Dimension].GLGroupLevel0 gl0
INNER JOIN [Dimension].GLGroupLevel1 ON gl0.[WHID] =
[Dimension].GLGroupLevel1.GLGroupLevel0FK ON
gl2.GLGroupLevel1FK =
[Dimension].GLGroupLevel1.[WHID]
INNER JOIN Fact.GLTransactionsMonthly trans ON acct.[WHID] =
trans.GLAccountFK
INNER JOIN [Dimension].GLProgram pgm ON trans.[GLProgramFK] =
pgm.[WHID] AND trans.[GLProgramFK] =
pgm.[WHID] AND trans.[GLProgramFK] = pgm.[WHID]
INNER JOIN [Dimension].[Date] d ON trans.EffectiveMonth = d.[Date]
AND trans.EffectiveMonth = d.[Date]
AND trans.EffectiveMonth = d.[Date]
INNER JOIN [Dimension].GLRegion ON pgm.GLRegionFK =
[Dimension].GLRegion.[WHID] AND pgm.GLRegionFK =
[Dimension].GLRegion.[WHID]
INNER JOIN [Reports].GLProgramGroupMapping map ON map.GLProgramFK =
pgm.[WHID]
INNER JOIN [Reports].GLProgramGroup grp ON grp.WHID =
map.GLProgramGroupFK
INNER JOIN [Reports].GLProgramGroupSet setname ON setname.WHID =
grp.GLProgramGroupSetFK)
CROSS APPLY (SELECT MAX(t.EffectiveMonth) AS [DateThru] FROM
Fact.GLTransactionsMonthly t WITH (NoLock)) mm
-- *** This, below -
WHERE (
(NOT (acct.[GLAccountCode] IN (N'9040',N'9047',N'4130')))
-- *** is the condition I want to execute, if my Parameter = False, and not
-- *** to execute, if my Parameter = True
AND (trans.[EffectiveMonth] BETWEEN @FYMonthBOP AND @FYMonthEOP)
AND ((setname.WHID IN (@GLProgramGroupSetsWHID)) OR (-1 IN
(@GLProgramGroupSetsWHID)))
AND ((grp.WHID IN (@GLProgramGroupsWHID)) OR (-1 IN
(@GLProgramGroupsWHID)))
AND ((pgm.[WHID] IN (@GLProgramsWHID_Groups)) OR
(-1 IN (@GLProgramsWHID_Groups)))
AND (
(pgm.[WHID] IN (
SELECT DISTINCT
f.[GLProgramFK]
FROM
Fact.GLTransactionsMonthly f
INNER JOIN [Dimension].[GLAccount] acct ON
f.[GLAccountFK] = acct.[WHID]
WHERE
(f.[EffectiveMonth] BETWEEN @FYMonthBOP AND @FYMonthEOP)
AND (NOT (acct.[GLAccountCode] IN (N'9040',N'9047')))
AND (acct.[GLAccountCode] BETWEEN '5000' AND '9999')
GROUP BY
f.[GLProgramFK]
HAVING
(SUM(f.[Amount]) <> 0))
)
OR
(pgm.[WHID] IN (
SELECT DISTINCT
f.[GLProgramFK]
FROM
Fact.GLTransactionsMonthly f
INNER JOIN [Dimension].[GLAccount] acct ON
f.[GLAccountFK] = acct.[WHID]
WHERE
(f.[EffectiveMonth] BETWEEN @FYMonthBOP AND @FYMonthEOP)
AND (NOT (acct.[GLAccountCode] IN (N'4130')))
AND (acct.[GLAccountCode] BETWEEN '4000' AND '4999')
GROUP BY
f.[GLProgramFK]
HAVING
(SUM(f.[Amount]) <> 0))
)
OR
(pgm.[GLProgramCode] IN ('549'))
)
)
【问题讨论】:
标签: sql-server tsql reporting-services parameters