我正在尝试解决似乎无法找到简单解决方案的问题。我正在尝试编写一个查询,该查询使用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;