繁体   English   中英

SQL Server:错误消息156,级别15,状态1,第12行关键字“ AS”附近的语法不正确

[英]SQL Server: error Msg 156, Level 15, State 1, Line 12 Incorrect syntax near the keyword 'AS'

遇到错误,我确定它与语法有关。

DECLARE @Rank AS INT = 0;

SELECT
    asn_key,
    asn_code,
    asn_name, 
    asn_eweb_description_ext,
    @Rank = CASE 
               WHEN asn_name = 'AONE' THEN 1
               WHEN asn_name = 'ACHI' THEN 1
               WHEN asn_name = 'ATLARGE' THEN 1
               WHEN asn_name = 'IFD' THEN 1
               ELSE 0 
            END AS ASN_Rank
FROM
    mb_association
JOIN
    mb_association_ext (nolock) ON asn_key = asn_key_ext
WHERE
    asn_eweb_description_ext IS NOT NULL
ORDER BY 
    ASN_Rank ASC

我需要对我的协会进行“分组”。 如果它不是列出的那些协会之一,那么它需要首先按ASC顺序列出,否则我需要将其最后按ASC顺序列出。 看起来它告诉我我有语法错误,但是我不确定为什么它会给我错误。 我看不到代码有任何问题,并且已经查看过类似的代码。

编辑:我试图以不同的方向来处理它,但是又遇到了另一个错误。 我对group by子句不太满意。

新代码:

select asn_key, asn_code, asn_name,  asn_eweb_description_ext
from mb_association join
     mb_association_ext (nolock)
     on asn_key = asn_key_ext
where asn_eweb_description_ext is not null
--order by (CASE WHEN asn_name in ('AONE', 'ACHI', 'ATLARGE', 'IFD') then 1 else 0 end);
GROUP BY (CASE WHEN asn_name in ('AONE', 'ACHI', 'ATLARGE', 'IFD') then 1 else 0 end);

错误:消息8120,级别16,状态1,行1在选择列表中的列mb_association.asn_key'无效,因为它既不包含在聚合函数中也不在GROUP BY子句中。

您不能使用别名两次为变量赋值:

SELECT asn_key, asn_code, asn_name, asn_eweb_description_ext,
       (CASE WHEN asn_name IN ('AONE', 'ACHI', 'ATLARGE', 'IFD') 
             THEN 1 ELSE 0 
        END) AS ASN_Rank
FROM mb_association JOIN 
     mb_association_ext 
     ON asn_key = asn_key_ext
WHERE asn_eweb_description_ext IS NOT NULL
ORDER BY ASN_Rank ASC;

另外,我刚刚简化了带有IN子句的多个WHEN

编辑:您的语法错误修复与查询的第一个版本,如果您想要按特定的顺序,那么我会做:

SELECT asn_key, asn_code, asn_name, asn_eweb_description_ext, ASN_Rank 
FROM mb_association JOIN 
     mb_association_ext 
     ON asn_key = asn_key_ext CROSS APPLY
     ( VALUES (CASE WHEN asn_name IN ('AONE', 'ACHI', 'ATLARGE', 'IFD') 
                    THEN 1 ELSE 0 
               END) 
     ) t(ASN_Rank)
WHERE asn_eweb_description_ext IS NOT NULL
ORDER BY ASN_Rank ASC;

您似乎想要这样的东西:

select asn_key, asn_code, asn_name,  asn_eweb_description_ext
from mb_association join
     mb_association_ext (nolock)
     on asn_key = asn_key_ext
where asn_eweb_description_ext is not null
order by (case when asn_name in ('AONE', 'ACHI', 'ATLARGE', 'IFD') then 1 else 0 end);

我不确定为什么您会考虑为此使用变量。 变量不合适。 而且,SQL Server不允许您在返回结果集的查询中为变量分配值-返回结果或分配变量,但不能同时分配。

多亏了我的同事让我走上了正确的道路,我得以解决问题并解决了。

SQL:

    SELECT 
    asn_key, 
    asn_code, 
    asn_name, 
    asn_eweb_description_ext,
    CASE WHEN asn_code NOT IN ('AHE', 'SHSMD', 'AHRMM', 'ASHRM', 'ASHHRA', 'AHVRP') THEN asn_code END AS Other_Individual_Membership_Organizations,
    CASE WHEN asn_code IN ('AHE', 'SHSMD', 'AHRMM', 'ASHRM', 'ASHHRA', 'AHVRP') THEN asn_code END AS Professional_Membership_Groups
FROM 
    mb_association 
    JOIN mb_association_ext (nolock) ON asn_key=asn_key_ext
WHERE 
    asn_eweb_description_ext IS NOT NULL
ORDER BY 
    Other_Individual_Membership_Organizations, Professional_Membership_Groups ASC

现在,我看到了有效的代码,这非常明智。 使用CASE语句筛选出第一组数据,并使用第二条CASE语句筛选第二列数据所需的数据。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM