【问题标题】:SQL Server: error Msg 156, Level 15, State 1, Line 12 Incorrect syntax near the keyword 'AS'SQL Server:错误消息 156,级别 15,状态 1,第 12 行关键字“AS”附近的语法不正确
【发布时间】:2018-09-25 15:26:35
【问题描述】:

出现错误,我确定它与语法有关。

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 顺序最后列出。看起来它告诉我我有一个语法错误,但我不确定它为什么给我这个错误。我没有看到代码有任何问题,并且我已经查看了类似的代码。

编辑: 我试图以不同的方向接近它,但又遇到了另一个错误。我对分组条款不是很好。

新代码:

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 子句中。

【问题讨论】:

  • 请用您正在使用的数据库标记您的问题。
  • 您想用@Rank 捕获什么 - 来自特定行的值?哪一行?

标签: sql sql-server


【解决方案1】:

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

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;

【讨论】:

  • 这是根据您的查询返回的:0 0 0 0 0 0 0 0 0 0 0 我认为这不起作用。应该有 0 和 1
  • @mholmes。 . .这回答了你的查询语法错误,我不知道你有什么数据。
  • 这篇文章的目的是帮助分配一个值来排名和修复语法。
  • 第二个版本也为 Rank 返回全 0
  • @mholmes when ASN_Rank i 0 asn_name 的值是多少?
【解决方案2】:

你似乎想要这样的东西:

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 不允许您在返回结果集的查询中为变量赋值——返回结果或赋值变量,但不能同时使用两者。

【讨论】:

  • 语法错误:消息 4145,级别 15,状态 1,第 6 行 在预期条件的上下文中指定的非布尔类型表达式,靠近 ')'。
  • 我更正了语法,但仍然没有正确排序: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 不为空 order by (CASE WHEN asn_name in ( 'AONE', 'ACHI', 'ATLARGE', 'IFD') 然后 1 else 0 end);
  • 使用“GROUP BY”会不会更方便?
  • @mholmes 。 . .我不确定您所说的“未正确订购”是什么意思。问题是将所有其他asn_names 放在最后,这就是这个逻辑的作用。
【解决方案3】:

感谢我的同事让我走上了正确的道路,我能够解决问题并解决它。

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语句筛选出我想要的第二列数据的数据。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多