Выберите строку на основе столбца - PullRequest
1 голос
/ 12 июля 2011

У меня есть таблица с данными, подобными следующим:

ID    Mfgr    Primary_Mfgr
a1    Acme    P
a1    Bcme    S
a1    Ccme    S
b1    Acme
b1    Bcme
c1    Acme    S
c1    Bcme
d1    Acme
d1    Bcme

Мне нужно создать оператор выбора, который на основе идентификатора вернет запись с P в качестве Primary_Mfgr, если нет Pзапись, затем вернуть пустую запись, если таковых не существует, вернуть первую S-запись.Во всех случаях, если есть дубликаты, верните первый результат.

Поэтому, используя приведенные выше данные, я ожидаю получить следующее из четырех разных запросов:

Запрос для a1:

a1    Acme    P

Запрос для b1:

b1    Acme

Запрос для c1:

c1    Bcme

Запрос для d1:

d1    Acme

В каждом случае мне нужновернуть только одну запись.Я не уверен, как я структурировал бы, чтобы сделать это.Например, я могу легко получить обратно все записи «a1», но я не уверен, как бы я написал запрос, который мог бы принять параметр для ID и при всех обстоятельствах вернуть правильную единственную запись.Я использую SQL Server 2008 R2.

Ответы [ 2 ]

3 голосов
/ 12 июля 2011

Это принимает «первый» Mfgr в алфавитном порядке (с учетом параметров сортировки и т. Д.), Где существует более одного для данной пары ID / Primary_Mfgr. В противном случае вы можете изменить вторичную сортировку на другой столбец (если он у вас есть) или пропустить его, чтобы получить случайную запись.

;WITH myCTE AS
(
    SELECT
       *,
       ROW_NUMBER() OVER (
               PARTITION BY ID
               ORDER BY
                  CASE Primary_Mfgr 
                     WHEN 'P' THEN 1 WHEN 'S' THEN 3 ELSE 2
                  END, Mfgr) AS rn
    FROM
       MyTable
)
SELECT *
FROM myCTE
WHERE rn = 1

Редактировать: вам не нужно запрашивать один раз для каждого идентификатора, что глупо: этот ответ делает это для всех идентификаторов за один раз. Таким образом, ваши 4 запроса выше становятся одним.

3 голосов
/ 12 июля 2011

Вы можете просто заказать по столбцу Primary_Mfgr с оператором case, а затем выбрать верхний 1

SELECT TOP 1 *
FROM Table1
WHERE ID = @ID
ORDER BY 
    CASE Primary_Mfgr 
        WHEN 'P' THEN 1
        WHEN ''  THEN 2
        ELSE 3
    END
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...