【问题标题】:Error creating stored procedure in SQL Server with PIVOT operator使用 PIVOT 运算符在 SQL Server 中创建存储过程时出错
【发布时间】:2018-02-14 23:36:28
【问题描述】:

我在尝试创建存储过程时收到此错误:

SQL Server 数据库错误:关键字“PROC”附近的语法不正确。

当我在两行之间执行 SQL 时,一切正常。但是,当我尝试执行存储过程时,出现错误。

我是存储过程的新手,所以我希望它只是一个错误的;GO

SET ANSI_NULLS ON;
GO
SET QUOTED_IDENTIFIER ON;
GO

IF EXISTS (SELECT object_id FROM AppGovernmentPrograms.Sys.Objects 
           WHERE type = 'P'
             AND name = 'usp_AppGovernmentPrograms_rptObjectives')
BEGIN
    DROP PROCEDURE dbo.usp_AppGovernmentPrograms_rptObjectives
END
GO

CREATE PROC [dbo].[usp_AppGovernmentPrograms_rptObjectives] 
    @ProgramYear INT, 
    @SummaryLevel VARCHAR(50)
AS
    SET NOCOUNT ON;

    WITH measuresPHS AS
    (
        SELECT
            mi.definition_id, mi.metric_name
        FROM
            StgEpicClarityPHS.dbo.metric_info mi WITH (nolock)
        WHERE 
            mi.definition_id IN (90020350, 90020300, 90020301, 90020302,
                                 90020303, 90020304, 90020305, 90020306,
                                 90020307, 90020308, 90020309, 90020310,
                                 90020311, 90020351, 90020352, 90020353,
                                 90020354, 90020355, 90020400)
    )
    SELECT
        provCID, NPI, TIN, year_dt,
        SUM([n90020350]) as "1.1n",
        SUM([d90020350]) as "1.1d",
        SUM([n90020300]) as "2.1n",
        SUM([d90020300]) as "2.1d",
        SUM([n90020301]) as "4.1n",
        SUM([d90020301]) as "4.1d", 
        SUM([n90020302]) as "4.2n",
        SUM([d90020302]) as "4.2d", 
        SUM([n90020303]) as "4.3n",
        SUM([d90020303]) as "4.3d",
        SUM([n90020304]) as "5.1n",
        SUM([d90020304]) as "5.1d",
        SUM([n90020305]) as "5.2n",
        SUM([d90020305]) as "5.2d",
        SUM([n90020306]) as "6.1n",
  sum([d90020306]) as "6.1d"
, sum([n90020307]) as "6.2n"
, sum([d90020307]) as "6.2d"
, sum([n90020308]) as "6.3n"
, sum([d90020308]) as "6.3d"
, sum([n90020309]) as "7.1n"
, sum([d90020309]) as "7.1d"
, sum([n90020310]) as "7.2n"
, sum([d90020310]) as "7.2d"
, sum([n90020311]) as "7.3n"
, sum([d90020311]) as "7.3d"
, sum([n90020351]) as "8.1n"
, sum([d90020351]) as "8.1d"
, sum([n90020352]) as "8.2n"
, sum([d90020352]) as "8.2d"
, sum([n90020353]) as "8.3n"
, sum([d90020353]) as "8.3d"
, sum([n90020354]) as "8.4n"
, sum([d90020354]) as "8.4d"
, sum([n90020355]) as "8.5n"
, sum([d90020355]) as "8.5d"
, sum([n90020400]) as "IAn"
, sum([d90020400]) as "IAd"

From
(
    Select
        sfi.prov_target_id as provCID
        , prov2.npi
        , cmi.facility_group_id as TIN
        , sum_data.year_dt
        , 'n' + cast(sfi.definition_id as varchar(15)) as id1 -- use for numerator
        , 'd' + cast(sfi.definition_id as varchar(15)) as id2 -- use for denominator
        , sum_data.numerator_year
        , sum_data.denominator_year

    from StgEpicClarityPHS.dbo.sum_facts_info sfi with(nolock)
        inner join StgEpicClarityPHS.dbo.sum_facts_info_2 sfi2 with(nolock) on sfi2.sum_facts_id = sfi.sum_facts_id
            inner join measuresPHS m with(nolock) on m.definition_id = sfi.definition_id
                inner join StgEpicClarityPHS.dbo.yearly_data sum_data with(nolock) on sum_data.sum_facts_id = sfi.sum_facts_id
                    left outer join StgEpicClarityPHS.dbo.cms_mu_info cmi with(nolock) on cmi.cms_mu_id = sfi2.tin_target_id
                        left outer join StgEpicClarityPHS.dbo.clarity_ser_2 prov2 with(nolock) on sfi.prov_target_id = prov2.prov_id
    Where sfi.record_type_c = 1                 -- standard summary, not a benchmark
        and (sum_data.year_dt = cast(concat('01/01/',:ProgramYear) as datetime)) -- (always use the start date of the reporting period)
        and (
                (:SummaryLevel = 'NT' and sfi.compld_sum_level = '4^73')        -- NPI/TIN (i.e. individual MIPS EC)
                or 
                (:SummaryLevel = 'T' and sfi.compld_sum_level = '73')       -- TIN (i.e. Group)
                or
                (:SummaryLevel = 'N' and sfi.compld_sum_level = '4') -- NPI only
            )
) nd
pivot
    ( sum(NUMERATOR_YEAR)
    for id1 in ([n90020350], [n90020300], [n90020301], [n90020302], [n90020303], [n90020304], [n90020305], [n90020306], [n90020307], [n90020308], [n90020309], [n90020310], [n90020311], [n90020351], [n90020352], [n90020353], [n90020354], [n90020355], [n90020400])
    ) as p1
pivot
    ( sum(DENOMINATOR_YEAR)
    for id2 in ([d90020350], [d90020300], [d90020301], [d90020302], [d90020303], [d90020304], [d90020305], [d90020306], [d90020307], [d90020308], [d90020309], [d90020310], [d90020311], [d90020351], [d90020352], [d90020353], [d90020354], [d90020355], [d90020400])
    ) as p2
    Group By provCID, NPI, TIN, year_dt
--------------------------------------------------------------------------------------------------------------------------------------
;

GO

【问题讨论】:

  • 您在尝试创建存储过程时遇到错误,对吧?
  • 是的,我是。我尝试了删除查找现有存储过程的语句的建议。那没有帮助。事实上,我用该语句创建了大约 15 个 sps。我应该提到我尝试用我在成功的 sp 中使用的更简单的查询替换上面的查询。然后我能够创建SP。但是,当我使用数据透视表重新添加更复杂的查询时,我再次收到错误消息。我还应该提到,我成功地创建了一个带有更简单的数据透视查询的 SP,所以我不能肯定它是 PIVOT。

标签: sql-server stored-procedures pivot


【解决方案1】:

您的问题可能只是您的查询在

处包含冒号
cast(concat('01/01/',:ProgramYear) as datetime)

在你的 where 子句中。应该是@ProgramYear

:SummaryLevel 也应该是@SummaryLevel

【讨论】:

    猜你喜欢
    • 2016-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-25
    • 1970-01-01
    • 2018-12-21
    相关资源
    最近更新 更多