Sql server ';靠近'的语法不正确;总和'';在这个SP中?

Sql server ';靠近'的语法不正确;总和'';在这个SP中?,sql-server,stored-procedures,sum,Sql Server,Stored Procedures,Sum,当我尝试在Visual Studio中执行此MS SQL Server存储过程(从服务器资源管理器中创建后)时,我会得到“Msg 102,级别15,状态1,过程duckbilledPlatypi,第21行”“SUM”“附近的语法不正确”: 问题是: SUM(CASE WHEN Ind.InvoiceDate BETWEEN @Week2Begin AND @EndDate THEN Ind.Usage ELSE 0 END) - 在上下文中,整个语句部分是: SUM(CASE WHEN In

当我尝试在Visual Studio中执行此MS SQL Server存储过程(从服务器资源管理器中创建后)时,我会得到“Msg 102,级别15,状态1,过程duckbilledPlatypi,第21行”“SUM”“附近的语法不正确”:

问题是:

SUM(CASE WHEN Ind.InvoiceDate BETWEEN @Week2Begin AND @EndDate THEN Ind.Usage ELSE 0 END)  -
在上下文中,整个语句部分是:

SUM(CASE WHEN Ind.InvoiceDate BETWEEN @Week2Begin AND @EndDate THEN Ind.Usage ELSE 0 END)  -
    SUM(CASE WHEN Ind.InvoiceDate BETWEEN @BegDate AND @Week1End THEN Ind.Price ELSE 0 END) PriceVariance,
?

我想也许我需要把这句话用另一对括号括起来,就像这样:

*(SUM(CASE WHEN Ind.InvoiceDate BETWEEN @Week2Begin AND @EndDate THEN Ind.Usage ELSE 0 END)  - 
 SUM(CASE WHEN Ind.InvoiceDate BETWEEN @BegDate AND @Week1End THEN Ind.Price ELSE 0 END)) PriceVariance,*
…但我还是得到了同样的错误信息

更新 下面(霍尼獾的回答):

我得到了以下指点:

Msg 164,15级,状态1,程序变量PriceByProductWithPriceChangePercentage,第30行 每个GROUP BY表达式必须至少包含一个非外部引用的列。 Msg 207,第16级,状态1,程序变量PriceByProductWithPriceChangePercentage,第16行 无效的列名“用法”。 Msg 207,16级,状态1,程序变量PriceByProductWithPriceChangePercentage,第17行 无效的列名“用法”。 Msg 207,16级,状态1,程序变量PriceByProductWithPriceChangePercentage,第20行 无效的列名“用法”。 Msg 207,16级,状态1,程序变量PriceByProductWithPriceChangePercentage,第21行 无效的列名“用法”。 Msg 207,16级,状态1,程序变量PriceByProductWithPriceChangePercentage,第23行 列名“用法”无效。

输入错误:

SUM(CASE [..snip...][ END) UsageVariance
                                        ^--missing comma
这就是为什么在下一行的
SUM
上出现语法错误的原因。您基本上有
SUM(…)SUM(…)
,这是无效的。

打字错误:

SUM(CASE [..snip...][ END) UsageVariance
                                        ^--missing comma

这就是为什么在下一行的
SUM
上出现语法错误的原因。基本上您有
SUM(…)SUM(…)
,这是无效的。

正如我在评论中所说,您应该添加一个
分组。其他人指出您缺少一个逗号,我还补充说:

    Select  Description,
    @BegDate  BegDate,
    @Week1End Week1End,
    @Week1End Week2Begin,
    @EndDate EndDate,
    SUM(CASE WHEN Ind.InvoiceDate BETWEEN @BegDate AND @Week1End THEN Ind.Usage ELSE 0 END) Week1Usage,
    SUM(CASE WHEN Ind.InvoiceDate BETWEEN @Week2Begin AND @EndDate THEN Ind.Usage ELSE 0 END) Week2Usage,
    SUM(CASE WHEN Ind.InvoiceDate BETWEEN @BegDate AND @Week1End THEN Ind.Price ELSE 0 END) Week1Price,
    SUM(CASE WHEN Ind.InvoiceDate BETWEEN @Week2Begin AND @EndDate THEN Ind.Price ELSE 0 END) -
   SUM(CASE WHEN Ind.InvoiceDate BETWEEN @BegDate AND @Week1End THEN Ind.Usage ELSE 0 END) UsageVariance,
    SUM(CASE WHEN Ind.InvoiceDate BETWEEN @Week2Begin AND @EndDate THEN Ind.Usage ELSE 0 END)  -
    SUM(CASE WHEN Ind.InvoiceDate BETWEEN @BegDate AND @Week1End THEN Ind.Price ELSE 0 END) PriceVariance,
    (SUM(CASE WHEN Ind.InvoiceDate BETWEEN @Week2Begin AND @EndDate THEN Ind.Usage ELSE 0 END)  -
    SUM(CASE WHEN Ind.InvoiceDate BETWEEN @BegDate AND @Week1End THEN Ind.Price ELSE 0 END) )
    / SUM(CASE WHEN Ind.InvoiceDate BETWEEN @BegDate AND @Week1End THEN Ind.Price ELSE 0 END) PercentageOfPriceVariance
    From    InvoiceDetail Ind
    Where   Ind.Unit = @Unit
    AND Ind.InvoiceDate BETWEEN @BegDate AND @EndDate
    Group By Description

编辑:显然
分组依据
中的变量是错误的

正如我在评论中所说,您应该添加一个
分组依据
。其他人指出您缺少一个逗号,我还补充说:

    Select  Description,
    @BegDate  BegDate,
    @Week1End Week1End,
    @Week1End Week2Begin,
    @EndDate EndDate,
    SUM(CASE WHEN Ind.InvoiceDate BETWEEN @BegDate AND @Week1End THEN Ind.Usage ELSE 0 END) Week1Usage,
    SUM(CASE WHEN Ind.InvoiceDate BETWEEN @Week2Begin AND @EndDate THEN Ind.Usage ELSE 0 END) Week2Usage,
    SUM(CASE WHEN Ind.InvoiceDate BETWEEN @BegDate AND @Week1End THEN Ind.Price ELSE 0 END) Week1Price,
    SUM(CASE WHEN Ind.InvoiceDate BETWEEN @Week2Begin AND @EndDate THEN Ind.Price ELSE 0 END) -
   SUM(CASE WHEN Ind.InvoiceDate BETWEEN @BegDate AND @Week1End THEN Ind.Usage ELSE 0 END) UsageVariance,
    SUM(CASE WHEN Ind.InvoiceDate BETWEEN @Week2Begin AND @EndDate THEN Ind.Usage ELSE 0 END)  -
    SUM(CASE WHEN Ind.InvoiceDate BETWEEN @BegDate AND @Week1End THEN Ind.Price ELSE 0 END) PriceVariance,
    (SUM(CASE WHEN Ind.InvoiceDate BETWEEN @Week2Begin AND @EndDate THEN Ind.Usage ELSE 0 END)  -
    SUM(CASE WHEN Ind.InvoiceDate BETWEEN @BegDate AND @Week1End THEN Ind.Price ELSE 0 END) )
    / SUM(CASE WHEN Ind.InvoiceDate BETWEEN @BegDate AND @Week1End THEN Ind.Price ELSE 0 END) PercentageOfPriceVariance
    From    InvoiceDetail Ind
    Where   Ind.Unit = @Unit
    AND Ind.InvoiceDate BETWEEN @BegDate AND @EndDate
    Group By Description

编辑:显然,
group by
中的变量是错误的

添加一个
group by
子句,在何处,使用什么值(按什么分组)?并且在
USAGEVERANCE
之后缺少一个逗号(问题不在于报告的行,而在于它上面的行)常规GROUP BY规则说:如果指定了GROUP BY子句,则SELECT列表中的每个列引用必须标识分组列或是集合函数的参数。缺少逗号是我喜欢以逗号开始新行的原因,而不是在前一行的末尾使用逗号。当它们都在一列中时,很容易发现。添加一个
group by
子句WHERE,使用什么值(按什么分组)?并且
USAGEVERANCE
后缺少一个逗号(问题不在于报告的行,而在于它上面的行)。常规group by规则说:如果指定了group by子句,选择列表中的每个列引用必须标识分组列或是集合函数的参数。缺少逗号是我喜欢用逗号开始新行的原因,而不是在前一行的末尾使用逗号。当它们都在一列中时很容易发现。但是“@Ind.InvoiceDate”中的“@”应该被删除,对吗?所以它只是“Ind.InvoiceDate”?谢谢;我已经为我的问题添加了一个更新。@B.ClayShannon,更新的答案,变量不应该在
组中,但是“@Ind.InvoiceDate”中的“@”应该被删除,对吗?所以它只是“Ind.InvoiceDate”?谢谢;我已经为我的问题添加了更新。@B.ClayShannon,更新的答案,变量不应该在
组中。