我正在尝试解决似乎无法找到简单解决方案的问题。我正在尝试编写一个查询,该查询使用case语句返回基于某些计数的值的情况。在同一查询中,我还需要返回一个orderid,因为我需要将其返回的数据用于另一个查询。

下面是查询:

select CASE WHEN count(name) = 0 THEN '1' ELSE CONVERT(varchar,count(name) + 1) END AS box
, orderid
from order
where len(name) = 7
and orderid = 'XYZ'
group by orderid

上面的问题是,正如您可以想象的那样,仅当数据中存在长度为7的名称时才返回行。无论如何,我都需要此查询来返回有效值。

当不存在长度为7的名称时,查询应返回:1, XYZ。当有效的7个长度名称存在时,该查询确实起作用。

处理此问题的最佳方法是什么?请注意,数据可以包含长度小于7的多个名称。在发生事务之后,这些名称将更改为长度7。

以下是示例数据和预期结果:
NAME     ORDERID
ABC      001
XYZ      001
123      001
OOP      002
LMT      002

当我对orderid = '1'运行查询时,查询应返回1, 001。数据将不断变化,因此最初如上图所示。随着交易的进行,数据将更改为:
    NAME           ORDERID
    ABCABCABC      001
    XYZ            001
    123            001
    OOP            002
    LMT            002

此时,我不必担心上面的查询,因为它会返回有效的行:2, 001
问题是当名称列我们的长度不正确时,查询什么也不返回。

最佳答案

您可能想要这样:

select convert(varchar(255),
               sum(case when len(name) = 7 and orderid = 'XYZ' then 1 else 0 end) + 1

                   end) as box,
       orderid
from order
group by orderid;

这会将所有过滤逻辑移到select中。

如果您想要的是带有计数的一行和一个订单ID(最好是XYZ),但如果没有的话,可以使用其他方法:
select convert(varchar(255),
               sum(case when len(name) = 7 and orderid = 'XYZ' then 1 else 0 end) + 1

                   end) as box,
       coalesce(max(case when orderid = 'XYZ' then orderid end),
                max(orderid)
               ) as orderid
from order
group by orderid;

10-07 19:38
查看更多