Как вывести столбец для каждой группы, членом которой является элемент? - PullRequest
0 голосов
/ 16 июня 2009

Учитывая эту таблицу ввода SQL

GroupId   Item
1         Fish
1         FishBowl
2         Fish
3         Fish

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

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

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

Ответы [ 3 ]

2 голосов
/ 16 июня 2009

Как правило, вы не можете создавать переменное количество групп со стандартным 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 и UNPIVOT », а остальное оставлю вам.

1 голос
/ 16 июня 2009

Один из самых часто задаваемых вопросов по SO.

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

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

0 голосов
/ 16 июня 2009

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

ВЫБРАТЬ Вещь, IF (GroupId = 1, 'Y', 'N') As IsInGroup1, IF (GroupId = 2, 'Y', 'N') As IsInGroup2, IF (GroupId = 3, 'Y', 'N') As IsInGroup3 ОТ New Table ГРУППА ПО Item;

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