Sql sybase查询中的语法错误

Sql sybase查询中的语法错误,sql,tsql,sybase,Sql,Tsql,Sybase,直到今天我才使用过sybase。我在Access中有一个查询正在使用First,并且有多个iif语句。我抱着最好的希望粘贴了我的查询,在第一部分我发现了错误。我从查询中删除了第一个,我在iif语句中得到了错误 我的问题是: SELECT Client.ClientId, First(Trans.SysId) AS FirstOfSysId, Client.Name1, Relation.Name1, Debtor.Name1, Account.AcctId, First(Trans.PostDa

直到今天我才使用过sybase。我在Access中有一个查询正在使用First,并且有多个iif语句。我抱着最好的希望粘贴了我的查询,在第一部分我发现了错误。我从查询中删除了第一个,我在iif语句中得到了错误

我的问题是:

SELECT Client.ClientId, First(Trans.SysId) AS FirstOfSysId, Client.Name1,
Relation.Name1, Debtor.Name1, Account.AcctId, First(Trans.PostDate) AS FirstOfPostDate,
Sum(IIf([TransType]="uc",[Amount],IIf([TransType]="CA",[Amount],IIf([TransType]="RAC",
[Amount],IIf([TransType]="UCBR",[Amount],[amount]*-1))))) AS TransAmount, 
Trans.CheckId,Relation.RelId
FROM (((Trans INNER JOIN Account ON Trans.SysAcctId = Account.SysId) 
INNER JOIN Debtor ON Account.SysDtrId = Debtor.SysId) 
INNER JOIN Relation ON Account.SysRelId = Relation.SysId) INNER JOIN Client ON
Relation.SysClientId = Client.SysId
WHERE (((Trans.TransType)="CA" Or (Trans.TransType)="NC" Or (Trans.TransType)="UC" Or
(Trans.TransType)="AC" 
Or (Trans.TransType)="UCB" Or (Trans.TransType)="RAC" Or (Trans.TransType)="UCB" Or
(Trans.TransType)="UCBR"))
GROUP BY Client.ClientId, Client.Name1, Relation.Name1, Debtor.Name1, Account.AcctId, 
Trans.CheckId, Relation.RelId
HAVING (((Client.ClientId)=[Forms]![frmCredit]![Combo112])
AND ((Sum(IIf([TransType]="uc",[Amount],IIf([TransType]="CA",[Amount],
IIf([TransType]="RAC", [Amount],IIf([TransType]="UCBR",[Amount],[amount]*-1))))))>0 
Or (Sum(IIf([TransType]="uc",[Amount],IIf([TransType]="CA",[Amount],
IIf([TransType]="RAC", [Amount],IIf([TransType]="UCBR",[Amount],[amount]*-1))))))<0)
AND ((Relation.RelId) Not Like "281099"))
ORDER BY Relation.Name1, Account.AcctId, Trans.CheckId
[Edit]已将更具可读性的查询添加到[/Edit]

我找不到关于转换第一个函数的文档,但是对于IIF,我应该将其转换为Case-when语句吗?我看过一篇文章,但我不确定它是否是最有效的,因为它是从1999年开始的

我得到的错误是第1行“FIRST”附近的语法错误。基于这篇文章,我使用了正确的语法


非常感谢您在正确语法中使用First以及我是否应该使用Case而不是iif时提供的任何帮助。

基于我对查询的看法,我认为您可以将其重写如下。我无法访问任何Sybase服务器来验证查询,因此我在MS SQL上尝试了它,但我用/**/注释了Sybase可能不需要的一些东西

这可能是完全错误的,也可能是正确的。如果是错误的,请在评论中告诉我,我将删除我的答案

SELECT 
    Client.ClientId, 
    FIRST_VALUE(Trans.SysId) /* OVER (ORDER BY Trans.Sysid) */ AS FirstOfSysId, 
    Client.Name1,
    Relation.Name1, 
    Debtor.Name1, 
    Account.AcctId, 
    FIRST_VALUE(Trans.PostDate) /* OVER (ORDER BY Trans.postdate) */ AS FirstOfPostDate,
    SUM(CASE 
          WHEN [TransType] IN ('uc', 'CA', 'RAC', 'UCBR') THEN AMOUNT 
          ELSE AMOUNT * -1 
       END
       ) AS TransAmount, 
    Trans.CheckId,
    Relation.RelId
FROM Trans 
INNER JOIN Account ON Trans.SysAcctId = Account.SysId
INNER JOIN Debtor ON Account.SysDtrId = Debtor.SysId 
INNER JOIN Relation ON Account.SysRelId = Relation.SysId
INNER JOIN Client ON Relation.SysClientId = Client.SysId

WHERE Trans.TransType IN ('CA','NC','UC','AC','UCB','RAC','UCB','UCBR')

GROUP BY 
    Client.ClientId, Client.Name1, 
    Relation.Name1, Debtor.Name1, 
    Account.AcctId, Trans.CheckId, 
    Relation.RelId /* , trans.sysid, trans.postdate */

HAVING 
    1=1 --AND (((Client.ClientId)=[Forms]![frmCredit]![Combo112])
    AND SUM(
          CASE WHEN [TransType] IN ('uc', 'CA', 'RAC', 'UCBR') THEN AMOUNT 
          ELSE AMOUNT * -1 END
          ) <> 0 
    AND Relation.RelId <> '281099'

ORDER BY Relation.Name1, Account.AcctId, Trans.CheckId
如果TransformType为'uc'、'CA'、'RAC'、'UCBR'或Seamount*-1中的任何一个,则只需获取装载量,该装载量应等同于:

SUM(CASE WHEN [TransType] IN ('uc', 'CA', 'RAC', 'UCBR') THEN AMOUNT 
        ELSE AMOUNT*-1 END) AS TransAmount, 
SUM(CASE WHEN [TransType] IN ('uc', 'CA', 'RAC', 'UCBR') THEN AMOUNT 
        ELSE AMOUNT*-1 END) <> 0 
在HAVING条款中:

((Sum(IIf([TransType]="uc",[Amount],IIf([TransType]="CA",[Amount],
IIf([TransType]="RAC", [Amount],IIf([TransType]="UCBR",[Amount],[amount]*-1))))))>0 
Or (Sum(IIf([TransType]="uc",[Amount],IIf([TransType]="CA",[Amount],
IIf([TransType]="RAC", [Amount],IIf([TransType]="UCBR",[Amount],[amount]*-1))))))<0)

谢谢你的回答。我复制了代码,在带有第一个\u值的行中,我得到了AS的一个错误。我删除了第一个_值,并通过将这些列添加到我的组中,这似乎起到了作用。我能做些什么让第一个或第一个值起作用吗?@JohnJanssen可能是Sybase不认识这个注释/*…*/所以你可以试着删除那个部分,或者干脆删除评论部分,然后保留超订单…部分。我第一次删除了评论,这导致了错误。我试着删除关于超额订单的评论。。。并使用我期望的结果运行查询。我感谢你的帮助。谢谢
SUM(CASE WHEN [TransType] IN ('uc', 'CA', 'RAC', 'UCBR') THEN AMOUNT 
        ELSE AMOUNT*-1 END) <> 0