2015-01-28 1 views
0

Я пытаюсь указать строки на основе двух столбцов - я не могу четко сформулировать то, что я пытаюсь сделать, поэтому в этом случае я надеюсь, что следующие таблицы тысячи слов.sql server - количество результатов с использованием двух столбцов

Учитывая следующую таблицу:

Name | Car Colour 
------------------- 
Alice | Red 
Alice | Green 
Alice | Blue 
Bill | Orange 
Bill | Purple 
Carol | Brown 
Carol | Orange 
Carol | Magenta 
Carol | Indigo 
Carol | Lilac 
Carol | White 

как бы вы показать следующее:

Name | Car Colour | Indiv. Car Index 
------------------------------------------- 
Alice | Red   | 1 
Alice | Green  | 2 
Alice | Blue  | 3 
Bill | Orange  | 1 
Bill | Purple  | 2 
Carol | Brown  | 1 
Carol | Orange  | 2 
Carol | Magenta  | 3 
Carol | Indigo  | 4 
Carol | Lilac  | 5 
Carol | White  | 6 

Edit - спасибо за ваши быстрые ответы - они работают в SQL Server 2008, но могу я, пожалуйста спросить Какова будет альтернатива SQL Server 2000? - Кажется, он не распознает ROW_NUMBER().

+0

Какую версию SQL Sever вы используете? –

+0

Итак, каждое «Имя» получает другую нумерацию, но как мы используем «Colour», чтобы узнать, какой индекс назначить. Для «Алисы» он выглядит обратным алфавитным порядком, но для «Билла», похоже, (вперед) в алфавитном порядке, и нет никакого шаблона, который я могу различить для «Кэрол». Есть ли еще один столбец, который вы не показали нам, который фактически определяет порядок? –

+0

К сожалению, я должен был упомянуть, что индекс не является функцией конкретного «Car Colour» - он просто зависит от количества цветов автомобилей, которые есть у каждого человека. – category

ответ

1

Поскольку вам необходимо заказать заказ по умолчанию для каждого Name, используйте SELECT 0 в пункте ORDER BY.

SELECT Name, [Car Colour], 
ROW_NUMBER() OVER (PARTITION BY Name ORDER BY (SELECT 0)) [Indiv. Car Index] 
FROM YOURTABLE 
  • Click here для просмотра результата

SQL SERVER 2000

SELECT * FROM 
(
    SELECT (SELECT count(*) from #TEMP as e2 
       WHERE e2.Name = e1.Name AND e2.[CAR COLOUR] <= e1.[CAR COLOUR]) as RNO, e1.Name,e1.[CAR COLOUR] 
    FROM #TEMP as e1 
)TAB 
ORDER BY NAME,RNO 
+0

Спасибо за это Сарат, что работает в SS 2008 – category

+0

Не обновлено ли обновление в Sql Server 2000? @Скобка –

1

Чтобы включить номер индекса в SELECT запросе, используйте ROW_NUMBER():

SELECT Name, [Car Color], 
     ROW_NUMBER() OVER (PARTITION BY Name ORDER BY [Car Color] DESC) as [Indiv. Car Index] 
FROM TableName 
ORDER BY Name 

Подробнее о ROW_NUMBER()here.

Результаты в SQL Fiddle.

+0

Спасибо, это довольно исчерпывающе - могу я спросить, в чем разница между ORDER BY (SELECT 0) Сарата Аванаву и вашим ORDER BY CarColor? – category

+0

@Bracket: Отредактировал мой ответ. Обновлена ​​ссылка. Не стесняйтесь принимать ответ, если вы удовлетворены. –

+0

ответ на ваш ответ будет работать только в том случае, если все автомобили имеют разные цвета, и если вы удалите порядок, по которому недействителен –

Смежные вопросы