如何编写SQL子查询?

时间:2018-08-17 23:06:57

标签: sql sql-server

我正在满足一项要求,即我需要从一个表中获得唯一记录计数,并且在列上进行类似搜索。

代码如下:

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_nameshipto_namebillto_nameend_user的预订中获得不同的数量,例如(政府,政府等)

5 个答案:

答案 0 :(得分:3)

这是一个可能更易于使用unpivotcountdistinct进行管理的选项:

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%”匹配。您可以将所有较长的搜索字符串都保留下来。但是我不确定在您的整个用例中是否总是可能的。