Проблема с функцией patindex () - PullRequest
0 голосов
/ 01 марта 2011

Я создал следующую таблицу

create table publisher(
  name varchar(20), 
  city varchar(20)
)

Я хочу выполнить следующее требование:

перечислить все позиции символа 'a' из имени.

Для этого Ии выполнил следующий запрос:

select patindex('%a%', name)
  from publisher;

Но он не показывает правильный вывод.Когда я ставлю столбец 'city' вместо столбца 'name', он показывает правильный вывод.В чем проблема?

Кроме того, я хочу отобразить имя издателя, получающего минимальную и максимальную прибыль.для этого я запустил следующий запрос:

select name, max(profit), min(profit) 
  from publisher;

Он показывает ошибку, например, что «имя» не является частью агрегатной функции ».что я должен сделать для получения имени издателей, которые получают минимальную и максимальную прибыль.

Ответы [ 4 ]

1 голос
/ 01 марта 2011

перечислить все позиции символа '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
0 голосов
/ 01 марта 2011

RE: Проблема с функцией PATINDEX заключается в том, что по сути говоря, вы хотите знать позицию первого вхождения буквы 'a' в значении.Вот как работает PATINDEX (см. MSDN: PATINDEX (Transact-SQL) ).

Если вы хотите получить позицию для каждого вхождения, вам потребуется рекурсивно искать строку.Робин Пейдж и Фил Фактор опубликовали несколько замечательных статей о манипуляции со строками на сайте www.Simple-Talk.com

Функции MAX и MIN являются агрегатными функциями.При использовании агрегатных функций все столбцы должны быть включены в агрегат или в предложение GROUP BY.

Это должно дать вам то, что вы ищете:

select name, max(profit), min(profit)
  from publisher
 group by name
0 голосов
/ 01 марта 2011

Для второй части вашего вопроса, предполагая индекс на 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  

Это может быть удовлетворено двумя поисками индекса: один в начале и один в конце индекса.

0 голосов
/ 01 марта 2011

Второй вопрос нуждается в группе по:

выберите имя, макс (прибыль), мин (прибыль) от издателя группа по имени

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...