【问题标题】:SQL Server 2008 R2 syntax errorSQL Server 2008 R2 语法错误
【发布时间】:2015-06-18 12:51:43
【问题描述】:

有人能告诉我为什么这会导致 SQL Server 2008 R2 出现语法错误吗?它在 SQL Server 2014 中运行良好。

SELECT        
    CustomerId, RequestDate, 
    SUM(InitialActualCount + (KeyCardCount * x.Activity)) 
       OVER (PARTITION BY CustomerId  ORDER BY RowNumber) AS TotalActualCount,
    RowNumber
FROM            
    (SELECT        
        *, 
        ROW_NUMBER() OVER (PARTITION BY CustomerId
                      ORDER BY CustomerID, RequestDate) AS RowNumber
     FROM            
        RequestTable) x

表结构:

 RequestTable (CustomerId, RequestDate,  KeyCardCount, Activity, InitialActualCount)        

错误:

“订单”附近的语法不正确。
'x' 附近的语法不正确。

提前感谢您的帮助!

【问题讨论】:

    标签: sql-server sql-server-2008


    【解决方案1】:

    至少你的一个问题是这一行:

    SELECT /*snip*/ sum(InitialActualCount + (KeyCardCount * x.Activity))
      OVER (partition BY CustomerId  ORDER BY RowNumber) AS TotalActualCount /*snip*/
    

    SQL Server 2012 中添加了在带有聚合的 OVER 子句中添加 ORDER BY 子句(在您的情况下为 SUM)的功能。

    在 2012 年之前,获取运行总计是一个众所周知的问题 - 请参阅 Best approaches for running totals – updated for SQL Server 2012 以获取对此的详尽讨论。

    【讨论】:

    • 感谢您的链接。我觉得你对我的问题是对的。
    • 绝对是你的问题。但即使他错了,你可以在你的 SUM 窗口函数中使用 ORDER BY,我不确定你为什么在做 SUM、MIN、MAX 或 COUNT 时会关心订单是什么.试着想想你会在哪里使用它。
    【解决方案2】:

    按照以下方式丢失“x”:

     SELECT
      CustomerId,
      RequestDate,
      SUM(InitialActualCount + ( KeyCardCount * x.Activity )) OVER ( PARTITION BY CustomerId ORDER BY RowNumber ) AS TotalActualCount,
      RowNumber
     FROM
      (
        SELECT
          *,
          ROW_NUMBER() OVER ( PARTITION BY CustomerId ORDER BY CustomerID, RequestDate ) AS RowNumber
        FROM
          RequestTable
      ) RequestTable ( CustomerId, RequestDate, KeyCardCount, Activity,
                       InitialActualCount )     
    

    【讨论】:

      【解决方案3】:
      SELECT        
         *, 
         ROW_NUMBER() OVER (PARTITION BY CustomerId
                            ORDER BY CustomerID, RequestDate) AS RowNumber
      FROM RequestTable
      

      你不需要别名来使用 * 吗?

      SELECT        
         a.*, 
         ROW_NUMBER() OVER (PARTITION BY CustomerId
                            ORDER BY CustomerID, RequestDate) AS RowNumber
      FROM RequestTable a
      

      【讨论】:

      • 不,这并没有解决问题。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多