我正在满足一项要求,即我需要从一个表中获得唯一记录计数,并且在列上进行类似搜索。
代码如下:
Select
s1.so_number
from
(
Select (billto_name) As so_number
from dbo.lamp_bookings
where billto_name Like '%government%' or billto_name Like '%gov%'
Union
Select (shipto_name) As so_number
from dbo.lamp_bookings
where shipto_name Like '%government%' or shipto_name Like '%gov%'
Union
Select (soldto_name) As so_number
from dbo.lamp_bookings
where soldto_name Like '%government%' or soldto_name Like '%gov%'
Union
Select (end_user) As so_number
from dbo.lamp_bookings
where end_user Like '%government%' or end_user Like '%gov%'
) s1
我需要从soldto_name
或shipto_name
或billto_name
或end_user
的预订中获得不同的数量,例如(政府,政府等)
答案 0 :(得分:3)
这是一个可能更易于使用unpivot
和count
与distinct
进行管理的选项:
select count(distinct u.field)
from lamp_bookings
unpivot
(
field
for fields in (billto_name, shipto_name, soldto_name, end_user)
) u
where u.field like '%gov%'
您还可以删除第二个where
条件-如果要检查gov
,也不需要检查government
。
答案 1 :(得分:1)
我将使用values
取消透视,然后应用逻辑:
select distinct v.so_number
from dbo.lamp_bookings b cross apply
(values (billto_name), (shipto_name), (soldto_name), (end_user)
) v(so_number)
where v.so_number like '%government%' or v.so_number Like '%gov%' ;
如果您只需要计数,请使用:
select count(distinct v.so_number)
from . . .
答案 2 :(得分:0)
使用SELECT COUNT(*)
代替SELECT s1.so_number
。
您不需要使用COUNT(DISTINCT so_number)
,因为UNION
会自动从结果中删除重复项。
也无需同时使用LIKE '%government%'
和LIKE '%gov%'
。如果字符串包含government
,则它还必须包含gov
。
答案 3 :(得分:0)
哈里, 可以使用以下查询。假设以名称命名的票据和以名称命名的票据具有政府,则需要将其视为1行。 我也相信您只在寻找计数。
抱歉,我无法添加评论,因此无法更新为答案。让我知道您的要求是否不同。
Select count (billto_name)
from dbo.lamp_bookings
where billto_name Like '%government%' or billto_name Like '%gov%' or shipto_name Like '%government%' or shipto_name Like '%gov%' or soldto_name Like '%government%' or soldto_name Like '%gov%' or end_user Like '%government%' or end_user Like '%gov%';
问候 贾娜
答案 4 :(得分:0)
您应该将所有条件放在一个大块中。然后,您不需要子选择。 它还将消除重复项。
例如,如果end_user和billto_name都与搜索字符串匹配,但不完全相同,则该行将被计数两次。我想你不想那样。因为“联盟”不会将它们合并在一起,因为它只会合并完全相同的重复行。
此外,“%gov%”与“%government%”匹配。您可以将所有较长的搜索字符串都保留下来。但是我不确定在您的整个用例中是否总是可能的。