Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何编写SQL子查询?_Sql_Sql Server - Fatal编程技术网

如何编写SQL子查询?

如何编写SQL子查询?,sql,sql-server,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

我正在处理一个需求,在这个需求中,我需要从一个表中获取唯一的记录计数,并在列上进行类似的搜索

代码如下:

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还是最终用户,如政府、政府。

使用选择计数*而不是选择s1.so_编号

您不需要使用COUNTDISTINCT so_number,因为UNION会自动从结果中删除重复项

也不需要同时使用“%government%”和“%gov%”。如果字符串包含政府,则它还必须包含政府。

使用SELECT COUNT*而不是SELECT s1.so\U number

您不需要使用COUNTDISTINCT so_number,因为UNION会自动从结果中删除重复项


也不需要同时使用“%government%”和“%gov%”。如果字符串包含government,则它还必须包含gov.

这里有一个选项,使用unpivot和distinct计数可能更容易管理:

此外,您还可以删除您的第二个where标准-如果您正在检查政府,也无需检查政府


以下是一个使用unpivot和distinct计数更容易管理的选项:

此外,您还可以删除您的第二个where标准-如果您正在检查政府,也无需检查政府

哈利, 可以使用下面的查询。假设“记名汇票”和“记名装运”有政府,则需要将其视为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%';
问候 贾娜

哈利, 可以使用下面的查询。假设“记名汇票”和“记名装运”有政府,则需要将其视为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%';
问候
雅娜

你应该把所有的条件都放在一个大区块里。那么你不需要再选择。 它还可以消除重复的内容

例如,如果end_user和billto_name都与搜索字符串匹配,但不完全相同,则该行将计数两次。我想你不会想要的。因为union不会将它们合并在一起,因为它只合并完全重复的行


此外,'%gov%'与'%government%'匹配。您可以保留所有较长的搜索字符串。但我不确定在您的整个用例中是否总是可以做到这一点

您应该将所有where条件放在一个大块中。那么你不需要再选择。 它还可以消除重复的内容

例如,如果end_user和billto_name都与搜索字符串匹配,但不完全相同,则该行将计数两次。我想你不会想要的。因为union不会将它们合并在一起,因为它只合并完全重复的行

此外,'%gov%'与'%government%'匹配。您可以保留所有较长的搜索字符串。但我不确定在您的整个用例中是否总是可以做到这一点

我将使用值取消PIVOT,然后应用逻辑:

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 . . .
我将使用值取消PIVOT,然后应用逻辑:

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 . . .

首先找出您正在使用的RDBMS。然后看,我将假设sql server,因为它们包含dbo。话虽如此,示例数据和预期结果将非常有用。您需要计数不同的s1.so_number.government包含gov,因此任何与“%government%”匹配的字符串也与“%gov%”匹配。您可以将WHERE子句缩短为WHERE,如“%gov%”。首先确定您使用的是哪种RDBMS。然后看,我将假设sql server,因为它们包含dbo。话虽如此,示例数据和预期结果将非常有用。您需要计数不同的s1.so_number.government包含gov,因此任何与“%government%”匹配的字符串也与“%gov%”匹配。您可以将WHERE子句缩短为WHERE,如“%gov%”……但聚合是在UNION之前计算的每个select的一部分…@WolfgangKais单个select中没有聚合。这两个查询可能会产生不同的结果。我一开始也这么认为,但你必须计算每个潜在的列,而不是只计算一列。请看这个演示,了解我的意思:@sgedes你是对的,我没有想到一行为结果提供多个名称的情况……但是聚合是在联合之前计算的每个选择的一部分…@WolfgangKais在单个选择中没有聚合。这两个查询可以产生不同的结果。我一开始也这么认为,但你必须计算每个潜在的列,而不是只计算一列。请看这个演示,了解我的意思:@sgedes你是对的,我没有想到一行会为结果贡献多个名称。这不是删除
不同栏目的名称重复。感谢您的回复,是的,您是对的……billto、shipto、enduser、soldto都有任何搜索词,如“政府”、“军队”、“部门”、“部”,每个搜索词只考虑一次。提到的代码ypu有效,但需要在查询中添加近8个搜索词。这并不是从不同的列中删除重复的名称。感谢您的回答,是的,您是对的……billto、shipto、enduser、soldto都有类似“政府”、“军队”、“部门”等搜索词,“部”和每个搜索词只考虑一次。提到的代码ypu有效,但需要在查询中添加近8个搜索词。感谢回复,unpivot选项有效,但我需要使用近8个词的搜索条件,并且这8个搜索中的任何一个都存在,它应该只返回一个计数。不同的记录需要在last@Harry-只需对需要搜索的每个单词使用或-其中u.field(如“%gov%”)或u.field(如“%blah%”)或…感谢您的回复,unpivot选项可以工作,但我需要使用搜索条件的单词几乎有8个,并且这8个搜索中的任何一个都存在,它应该只返回一个计数。不同的记录需要在last@Harry-只需对您需要搜索的每个单词使用或-其中u.field(如“%gov%”)或u.field(如“%blah%”)或…谢谢回复,您能帮我写代码吗谢谢回复,您能帮我写代码吗