2009-06-16 12 views
0

С учетом этого SQL таблицы вводаКак вывести столбец для каждой группы, членом которой является элемент?

GroupId Item 
1   Fish 
1   FishBowl 
2   Fish 
3   Fish 

Как я могу получить этот выход?

Item  IsInGroup1 IsInGroup2 IsInGroup3 
Fish  Y   Y   Y 
FishBowl Y   N   N 

Пожалуйста, обратите внимание, что количество групп может быть переменной

+0

Пожалуйста, опубликуйте схемы таблиц и тестовые данные. Не то, чтобы те, кто отвечает, нуждаются в этом, чтобы сказать вам использовать оператор PIVOT, но это хорошая практика. –

+0

Как настроить работу переменных групп? –

+0

Создает один столбец за значение столбца GroupId. В вашем примере будет три столбца с именами [1], [2] и [3]. См. Http://msdn.microsoft.com/en-us/library/ms177410.aspx. –

ответ

2

В общем, вы не можете сделать переменное количество групп со стандартным SQL. Вы должны знать группы заранее. Это связано с тем, что любой SQL-запрос должен знать количество столбцов и их имена.

SELECT Item, 
    MAX(CASE GroupId WHEN 1 THEN 'Y' ELSE 'N' END) AS IsInGroup1, 
    MAX(CASE GroupId WHEN 2 THEN 'Y' ELSE 'N' END) AS IsInGroup2, 
    MAX(CASE GroupId WHEN 3 THEN 'Y' ELSE 'N' END) AS IsInGroup3 
FROM ThisInputTable 
GROUP BY Item; 

У Microsoft SQL Server есть определенные возможности для таблиц PIVOT, однако это не стандартный SQL. Я не являюсь пользователем Microsoft, поэтому я дам вам ссылку на «Using PIVOT and UNPIVOT» и оставлю все остальное вам.

0

Ну, я полагаю, это зависит от того, какую базу данных вы используете. Это работает для меня:

ВЫБРАТЬ Предмета, IF (GroupID = 1, 'Y', 'N') Как IsInGroup1, IF (GroupID = 2, 'Y', 'N') Как IsInGroup2, IF (GroupId = 3, 'Y', 'N') As IsInGroup3 ОТ New Table GROUP BY Продукт;

+0

Похож на синтаксис MySQL. Microsoft SQL Server будет жаловаться на использование GROUP BY. Кроме того, MS SQL Server не имеет функции IF(), которая работает так же, как в MySQL. –

+0

Для совместимости с ANSI вам необходимо использовать MAX (GroupId), так как вы не можете вернуть результат, который не находится в GROUP BY, или результат агрегатной функции в наборе. –

1

Один из mostfrequentlyaskedquestions на SO.

В принципе, вы можете использовать динамический SQL для построения запроса формы, которую дает Билл Карвин, определяя количество групп и имя для каждой группы. Такой запрос, который вы создаете, может быть ANSI SQL. Вы также можете создать проприетарный синтаксис для оператора PIVOT SQL Server 2008 (2005 и выше), о котором говорил Билл.

Мой пример на first link должен быть довольно ясным.