[英]Msg 156, Level 15, State 1, Line 2 Incorrect syntax near the keyword 'case'. Whats wrong in my SQL
[英]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.