我创建了以下表格
create table publisher(
name varchar(20),
city varchar(20)
)
我想运行以下要求:
从名称列出字符'a'的所有位置。
为此,Ii运行了以下查询:
select patindex('%a%', name)
from publisher;
但是,它没有显示正确的输出。当我输入'city'列而不是'name'列时,它会显示正确的输出。有什么问题?
另外,我想显示获得最低和最高利润的发布商的名称。为此,我运行以下查询:
select name, max(profit), min(profit)
from publisher;
它显示错误,例如“'name'不是聚合函数的一部分”。如何检索获得最低和最高利润的出版商名称。
答案 0 :(得分:1)
列出charcter'a'的所有位置 来自名字。
要做到这一点,你需要一个数字或Tally表。如果您使用的是SQL Server 2005或更高版本,则可以使用公用表表达式对其进行模拟:
With Numbers As
(
Select 1 As Value
Union All
Select Value + 1
From Numbers
Where Value <= 100 --replace with max size of Publisher Name
)
Select P.Name, N.Value
From Numbers As N
Cross Join Publishers As P
Where Substring( P.Name, N.Value, 1 ) = 'a'
Option ( Maxrecursion 0);
另外,我想显示名称 最低和最低的出版商 最大利润。
With ProfitRanks As
(
Select Name
, Rank() Over ( Order By Profit Asc ) As LowestProfitRnk
, Rank() Over ( Order By Profit Desc ) As HighestProfitRnk
From Publisher
)
Select Name, Profit
From ProfitRanks
Where LowestProfitRnk = 1
Or HighestProfitRnk = 1
答案 1 :(得分:0)
第二个问题需要一个小组:
选择名称,最大(利润),最小(利润) 来自出版商 按名称分组
答案 2 :(得分:0)
对于你的问题的第2部分假设profit
的索引我会使用。
select name,
profit
FROM (SELECT TOP(1) with ties name,
profit
FROM publisher
ORDER BY profit) mx
UNION
select name,
profit
FROM (SELECT TOP(1) with ties name,
profit
FROM publisher
ORDER BY profit DESC) mn
这可以满足于2指数在开始时寻求一个,在指数末尾寻找一个。
答案 3 :(得分:0)
RE:PATINDEX功能的问题是因为基本上你想要知道字母第一次出现的位置&#39; a&#39;在价值中。这就是PATINDEX的工作原理(见MSDN: PATINDEX (Transact-SQL))。
如果您想获得每次出现的位置,那么您需要递归搜索字符串。 Robyn Page&amp; Phil Factor在string manipluation at www.Simple-Talk.com
上有一些很棒的文章MAX和MIN功能是聚合功能。使用聚合函数时,所有列必须包含在聚合或GROUP BY子句中。
这可以为您提供您正在寻找的内容:
select name, max(profit), min(profit)
from publisher
group by name