【问题标题】:SQL Server CTE query syntax errorSQL Server CTE 查询语法错误
【发布时间】:2016-04-17 15:18:55
【问题描述】:

我收到这个错误

消息 102,第 15 级,状态 1,第 1 行
'=' 附近的语法不正确。

来自这个查询:

seq = row_number() over 
(
  partition by t.CustID
  order by t.InvoiceID, 
           t.Date,
           CASE WHEN t.S_Type = 'Receipt Voucher' THEN 1 ELSE 2 END
 )

;

WITH cte
AS (
    SELECT  CustID,
        [InvoiceID],
        S_Type,
        DATE,
        Debit,
        Credit,
        seq = row_number() OVER (
            PARTITION BY CustID
            ORDER BY InvoiceID,
                DATE,
                CASE 
                    WHEN S_Type = 'Receipt Voucher'
                        THEN 1
                    ELSE 2
                    END
            )
    FROM Statement
    )
SELECT c.[InvoiceID],
    c.S_Type AS Type,
    c.DATE,
    c.Debit,
    c.Credit,
    b.Balance
FROM cte c
CROSS APPLY (
    SELECT Balance = SUM(Debit) - SUM(Credit)
    FROM cte AS x
    WHERE x.CustID = c.CustID
        AND x.seq <= c.seq
    ) b
WHERE c.CustID = '48'
    AND DATE BETWEEN '2015-01-01'
        AND '2016-01-01'
ORDER BY seq

我尝试在 seq 前面添加选择,但出现以下错误:

消息 4104,第 16 级,状态 1,第 3 行
无法绑定多部分标识符“t.CustID”。

消息 4104,第 16 级,状态 1,第 4 行
无法绑定多部分标识符“t.InvoiceID”。

消息 4104,第 16 级,状态 1,第 5 行
无法绑定多部分标识符“t.Date”。

消息 4104,第 16 级,状态 1,第 6 行
无法绑定多部分标识符“t.S_Type”。

消息 4104,第 16 级,状态 1,第 34 行
无法绑定多部分标识符“.Debit”。

【问题讨论】:

  • 我对您发布的代码感到困惑。你真的在执行WITH cte上面的片段吗?

标签: sql sql-server sql-server-2008 tsql


【解决方案1】:

您的请求开头有一段代码 seq=... 无效。您的查询可以使用 cte 中计算的 seq

WITH cte
AS (
    SELECT  CustID,
        [InvoiceID],
        S_Type,
        DATE,
        Debit,
        Credit,
        seq = row_number() OVER (
            PARTITION BY CustID
            ORDER BY InvoiceID,
            DATE,
            CASE 
                WHEN S_Type = 'Receipt Voucher'
                    THEN 1
                ELSE 2
                END
            )
    FROM Statement
    )
SELECT c.[InvoiceID],
    c.S_Type AS Type,
    c.DATE,
    c.Debit,
    c.Credit,
    b.Balance
FROM cte c
CROSS APPLY (
    SELECT Balance = SUM(Debit) - SUM(Credit)
    FROM cte AS x
    WHERE x.CustID = c.CustID
        AND x.seq <= c.seq
    ) b
WHERE c.CustID = '48'
    AND DATE BETWEEN '2015-01-01'
    AND '2016-01-01'

ORDER BY c.seq;

Debit 前还缺少一个 c

感谢 a_horse_with_no_name。

【讨论】:

  • 我仍然收到错误你能提供完整的代码可能是我错误地应用它
  • @Ayman 我编辑了我的答案并纠正了另一个小问题
  • 谢谢,但我仍然有问题错误 msg "t.CustID,t.InvoiceID,t.Date,t.S_Type" could not be bound
  • 我认为您不允许在 order by 子句中使用窗口函数(而且您不需要它,因为您可以使用 CTE 中的 seq 列)
  • 我按照 a_horse_with_no_name 的好建议再次编辑了我的答案
猜你喜欢
  • 2012-09-10
  • 2015-08-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-29
  • 1970-01-01
  • 2015-04-22
  • 2019-05-10
相关资源
最近更新 更多