SQL查询中的Synatx错误

SQL查询中的Synatx错误,sql,sql-server,Sql,Sql Server,我有一个查询,它给了我语法错误。我不明白。请帮我整理一下 SELECT T3.[AcctName], SUM(T0.[DebLTotal]/85) AS buget,(Select sum(T3.[Debit]/85) From JDT1 T3 ) as 'CurrentBudget' FROM OBGT T0 INNER JOIN (SELECT CASE WHEN T1.[AcctCode] = '5001' THEN T1.[Acct

我有一个查询,它给了我语法错误。我不明白。请帮我整理一下

SELECT 
    T3.[AcctName],
    SUM(T0.[DebLTotal]/85) AS buget,(Select sum(T3.[Debit]/85) From JDT1 T3 ) as 'CurrentBudget'
FROM 
    OBGT T0
INNER JOIN
    (SELECT 
         CASE WHEN T1.[AcctCode] = '5001' THEN T1.[AcctName] = 'Salaries'
         END as [AcctName],
         [AcctCode]
     FROM 
         OACT AS T1) AS T3 ON T0.[AcctCode] = T3.[AcctCode]
INNER JOIN 
    OBGS T2 ON T0.[Instance] = T2.[AbsId]
WHERE
    T2.[Name] = 'Main Budget 2015'
GROUP BY 
    T3.[AcctName], T2.[Name]
我在这一行的“=”附近得到了
错误的语法

SELECT CASE WHEN T1.[AcctCode] = '5001' THEN T1.[AcctName] = 'Salaries'

是不是因为你把一个数字放在了周围?试着把它写成T1。[AcctCode]=5001

这可能是因为你在一个数字周围放了一个“数字”吗?尝试将其写为
T1。[AcctCode]=5001

这应该可以解决您的问题,下面的行不正确

 SELECT CASE WHEN T1.[AcctCode] = '5001' THEN T1.[AcctName] = 'Salaries'



  SELECT  T3.[AcctName] ,
        SUM(T0.[DebLTotal] / 85) AS buget ,
        ( SELECT    SUM(T3.[Debit] / 85)
          FROM      JDT1 T3
        ) AS 'CurrentBudget'
FROM    OBGT T0
        INNER JOIN ( SELECT CASE WHEN T1.[AcctCode] = '5001' THEN 'Salaries'
                                 ELSE T1.[AcctName]
                            END AS [AcctName] ,
                            [AcctCode]
                     FROM   OACT AS T1
                   ) AS T3 ON T0.[AcctCode] = T3.[AcctCode]
        INNER JOIN OBGS T2 ON T0.[Instance] = T2.[AbsId]
WHERE   T2.[Name] = 'Main Budget 2015'
GROUP BY T3.[AcctName] ,
        T2.[Name]

这将解决您的问题,下面的行不正确

 SELECT CASE WHEN T1.[AcctCode] = '5001' THEN T1.[AcctName] = 'Salaries'



  SELECT  T3.[AcctName] ,
        SUM(T0.[DebLTotal] / 85) AS buget ,
        ( SELECT    SUM(T3.[Debit] / 85)
          FROM      JDT1 T3
        ) AS 'CurrentBudget'
FROM    OBGT T0
        INNER JOIN ( SELECT CASE WHEN T1.[AcctCode] = '5001' THEN 'Salaries'
                                 ELSE T1.[AcctName]
                            END AS [AcctName] ,
                            [AcctCode]
                     FROM   OACT AS T1
                   ) AS T3 ON T0.[AcctCode] = T3.[AcctCode]
        INNER JOIN OBGS T2 ON T0.[Instance] = T2.[AbsId]
WHERE   T2.[Name] = 'Main Budget 2015'
GROUP BY T3.[AcctName] ,
        T2.[Name]

问题是您在Case表达式中的赋值:

SELECT 
     CASE WHEN T1.[AcctCode] = '5001' THEN T1.[AcctName] = 'Salaries'
     END as [AcctName],
     [AcctCode]
 FROM 
     OACT AS T1
这是行不通的,因为
CASE
只是T-SQL中的一个表达式——它只能返回一个原子值——它不能进行分配或控制代码流

您需要这样使用它:

SELECT 
     [AcctName] = CASE 
                     WHEN [AcctCode] = N'5001' THEN 'Salaries'
                     ELSE 'Other'
                  END,
     [AcctCode]
 FROM 
     OACT AS T1
如果您的
actcode
是5001-那么您使用
Salaries
作为
AcctName
(如果它是另一个值-您想做什么?)

更新:不确定您所说的仅执行其他部分是什么意思-请查看此演示:

DECLARE @t1 TABLE (ID INT NOT NULL, AcctCode INT)

INSERT INTO @T1 VALUES(1, 5000), (2, 5001), (3, 5000), (4, 5002), (5, 5001), (6, 4999)

SELECT 
     [AcctName] = CASE 
                     WHEN [AcctCode] = 5001 THEN 'Salaries'
                     ELSE 'Other'
                  END,
     [AcctCode]
 FROM @T1

输出将<强>清楚地显示< <代码>案例> /COD>表达式工作正常-对于<代码> 5001代码/代码>的值,<代码> ActNeX<代码>被设置为<代码>薪资< /代码>,而对于所有其他值,它返回“代码>其他< /代码> .< /p> < P>问题是您在Case表达式中的赋值:

SELECT 
     CASE WHEN T1.[AcctCode] = '5001' THEN T1.[AcctName] = 'Salaries'
     END as [AcctName],
     [AcctCode]
 FROM 
     OACT AS T1
这是行不通的,因为
CASE
只是T-SQL中的一个表达式——它只能返回一个原子值——它不能进行分配或控制代码流

您需要这样使用它:

SELECT 
     [AcctName] = CASE 
                     WHEN [AcctCode] = N'5001' THEN 'Salaries'
                     ELSE 'Other'
                  END,
     [AcctCode]
 FROM 
     OACT AS T1
如果您的
actcode
是5001-那么您使用
Salaries
作为
AcctName
(如果它是另一个值-您想做什么?)

更新:不确定您所说的仅执行其他部分是什么意思-请查看此演示:

DECLARE @t1 TABLE (ID INT NOT NULL, AcctCode INT)

INSERT INTO @T1 VALUES(1, 5000), (2, 5001), (3, 5000), (4, 5002), (5, 5001), (6, 4999)

SELECT 
     [AcctName] = CASE 
                     WHEN [AcctCode] = 5001 THEN 'Salaries'
                     ELSE 'Other'
                  END,
     [AcctCode]
 FROM @T1

输出将清楚地显示我的
CASE
表达式工作正常-对于
5001
的值,
AcctName
设置为
Salaries
,而对于所有其他值,它返回
other

,我只得到此查询的其他部分

SELECT  
    T3.[AcctName] ,
    SUM(T0.[DebLTotal] / 85) AS buget ,
    (SELECT SUM(T3.[Debit] / 85)
     FROM JDT1 T3) AS 'CurrentBudget'
 FROM    
     OBGT T0
 INNER JOIN 
     (SELECT 
          AcctName = CASE 
                         WHEN T1.[AcctCode] = '10' THEN 'Fixed Assets'
                         WHEN T1.[AcctCode] = '50' THEN 'Salaries'
                         ELSE 'Other'
                     END,
          [AcctCode]
      FROM   
          OACT AS T1) AS T3 ON T0.[AcctCode] = T3.[AcctCode]
INNER JOIN 
    OBGS T2 ON T0.[Instance] = T2.[AbsId]
WHERE   
    T2.[Name] = 'Main Budget 2015'
GROUP BY 
    T3.[AcctName], T2.[Name]
只有
其他“其他”
在工作。当
时,无论我在我的
案例中放置什么,它都会返回一行,如下所示:

AcctName budget
Other     2312836

我只得到这个查询的其他部分

SELECT  
    T3.[AcctName] ,
    SUM(T0.[DebLTotal] / 85) AS buget ,
    (SELECT SUM(T3.[Debit] / 85)
     FROM JDT1 T3) AS 'CurrentBudget'
 FROM    
     OBGT T0
 INNER JOIN 
     (SELECT 
          AcctName = CASE 
                         WHEN T1.[AcctCode] = '10' THEN 'Fixed Assets'
                         WHEN T1.[AcctCode] = '50' THEN 'Salaries'
                         ELSE 'Other'
                     END,
          [AcctCode]
      FROM   
          OACT AS T1) AS T3 ON T0.[AcctCode] = T3.[AcctCode]
INNER JOIN 
    OBGS T2 ON T0.[Instance] = T2.[AbsId]
WHERE   
    T2.[Name] = 'Main Budget 2015'
GROUP BY 
    T3.[AcctName], T2.[Name]
只有
其他“其他”
在工作。当
时,无论我在我的
案例中放置什么,它都会返回一行,如下所示:

AcctName budget
Other     2312836


看起来您正在尝试更新case表达式中的列…是的@贾尔赫。。我不明白。如果T1.[AcctCode]='5001',那么T-SQL中的T2.[AcctName]应该是'Salaries'
CASE
是一个表达式-它只能返回单个原子值-您不能在
then
部分中有赋值@那我怎么才能得到所需的东西呢?如果T1。[AcctCode]=“5001”,那么T2。[AcctName]应该是“Salaries”,看起来您正在尝试更新case表达式中的列……是的@贾尔赫。。我不明白。如果T1.[AcctCode]='5001',那么T-SQL中的T2.[AcctName]应该是'Salaries'
CASE
是一个表达式-它只能返回单个原子值-您不能在
then
部分中有赋值@那我怎么才能得到所需的东西呢?如果T1.[AcctCode]=“5001”,那么T2.[AcctName]应该是“工资”,这是无法解决的。。你删除了T2。[账号],我需要它。如果T1.[AcctCode]=“5001”,那么T2.[AcctName]应该是“工资”,这是无法解决的。。你删除了T2。[账号],我需要它。如果T1.[AcctCode]='5001',那么T2.[AcctName]应该是'Salaries',它仍然会给我同样的错误。如果我删除那些too,它仍然会给我同样的错误。如果我删除那些tooth'Other'。通过使用这个,我现在得到的是,nvarchar值“1000000000000”的转换溢出了一个int列。@Kirat:不确定您的
AcctCode
的数据类型是什么-因为它包含“code”,我假设它是一个数字列。如果不是-那么在值
'5001'
周围加上单引号,我以前没有注意到。您的代码只执行其他部分。请告诉我答案。我不能再提另一个问题了。@Kirat:我不知道你的电脑发生了什么事-它对我来说很好(请参阅我的最新回复)-一定是其他原因导致了你的问题-对不起,不能说那是什么,从这里开始…然后是“其他”。通过使用这个,我现在得到的是,nvarchar值“1000000000000”的转换溢出了一个int列。@Kirat:不确定您的
AcctCode
的数据类型是什么-因为它包含“code”,我假设它是一个数字列。如果不是-那么在值
'5001'
周围加上单引号,我以前没有注意到。您的代码只执行其他部分。请告诉我答案。我不能再提另一个问题了。@Kirat:我不知道你的计算机上发生了什么事-它对我来说运行正常(请参阅我的最新回复)-一定是其他原因导致了你的问题-对不起,我不能从这里说这是什么…AcctCode
列的数据类型是什么,你有什么样的样本数据???@marc_s it is nvarchar(20)你能运行这个查询并在你的例子中输出
AcctCode
??该字符串中是否有任何特殊字符,或者是否有前导空格或类似的内容??是的@marc_s我可以运行。没有比这更好的了。我不知道怎么了。我也在这里贴。但你的那个很好用。我只是不知道为什么不working@marc_s如果主select语句正在生效,是否可能。。可能是。。是吗?
AcctCode
列的数据类型是什么?您在其中有什么样的样本数据???@marc_s是nvarchar(20)您可以运行此查询并