#mysql #sql #mysql-workbench
Вопрос:
Я пытаюсь создать новый столбец, используя следующие условия в MySQL Workbench.
Я пытался написать код, чтобы получить новый столбец (результат), и это должно быть как: Если да, то азиатский черный если да, то черный если черный-это да, а другие да, то черный , если Белый, то белым, если испанец да, то испаноязычные латиноамериканцы если «да», а другие «да», то испанская Тихоокеанская Тихоокеанская Если да, то если Ближний да, то средний если да, то другими, если более одного сообщали тогда несколько (ожидаем, черный и другие » да » и испаноязычные и другие-это да) еще Notreported
CREATE TABLE Test(
ID INT NOT NULL,
Asian CHAR(7),
Black CHAR(9),
White CHAR(6),
Hispanic CHAR(5),
Pacific CHAR(7),
Middle CHAR(9),
Other CHAR(6)
);
insert into Test values
(1,'Yes','No','No','No', 'No','No','No'),
(2,'No','Yes','No','No', 'No','No','No'),
(3,'No','No','Yes','No', 'No','No','No'),
(4,'No','No','No','Yes', 'No','No','No'),
(5,'No','No','No','No', 'Yes','No','No'),
(6,'No','No','No','No', 'No','Yes','No'),
(7,'No','No','No','No', 'No','No','Yes'),
(8,'No','No','No','No', 'Yes','No','Yes'),
(9,'No','Yes','No','No', 'No','No','Yes'),
(10,'Yes','Yes','Yes','No', 'No','No','Yes'),
(11,'No','No','Yes','Yes', 'No','No','Yes'),
(12,'No','No','No','Yes', 'No','No','Yes'),
(13,'No','Yes','No','No', 'No','No','Yes')
;
Select ID, Asian, Black, White, Hispanic, Pacific, Middle, Other,
case
when Asian='Yes' then
case
when Black='No' then 'Asian'
when White='No' then 'Asian'
when Hispanic='No' then 'Asian'
when Pacific='No' then 'Asian'
when Middle='No' then 'Asian'
when Other='No' then 'Asian'
end
When Black='Yes' then
case
when Asian='No' then 'Black'
when White='No' then 'Black'
when Hispanic='No' then 'Black'
when Pacific='No' then 'Black'
when Middle='No' then 'Black'
when Other='Yes' then 'Black'
end
When White='Yes' then
case
when Asian='No' then 'White'
when Black='No' then 'White'
when Hispanic='No' then 'White'
when Pacific='No' then 'White'
when Middle='No' then 'White'
when Other='No' then 'White'
end
When Hispanic='Yes' then
case
when Asian='No' then 'Hispanic'
when Black='No' then 'Hispanic'
when White='No' then 'Hispanic'
when Pacific='No' then 'Hispanic'
when Middle='No' then 'Hispanic'
when Other='Yes' then 'Hispanic'
end
When Pacific='Yes' then
case
when Asian='No' then 'Pacific'
when Black='No' then 'Pacific'
when White='No' then 'Pacific'
when Hispanic='No' then 'Pacific'
when Middle='No' then 'Pacific'
when Other='No' then 'Pacific'
end
When Middle='Yes' then
case
when Asian='No' then 'Middle'
when Black='No' then 'Middle'
when White='No' then 'Middle'
when Hispanic='No' then 'Middle'
when Pacific='No' then 'Middle'
when Other='No' then 'Middle'
end
When Other='Yes' then
case
when Asian='No' then 'Other'
when Black='No' then 'Other'
when White='No' then 'Other'
when Hispanic='No' then 'Other'
when Pacific='No' then 'Other'
when Middle='No' then 'Other'
end
else 'Multiple'
end AS Race
FROM Test;
Я не получил «Несколько». Ваша помощь и вклад будут высоко оценены. Спасибо.
Комментарии:
1. Так, как вы структурировали свое внешнее
CASE
утверждение, вы получите «Несколько» только в том случае, если есть запись, в которой Азиатский= «Нет», Белый=»Нет», Черный=»Нет» и т. Д. Для всех записей теста, которые вы показали, есть по крайней мере одно «Да», что означает, что одно из внутреннихCASE
утверждений будет оценено.2. Проблема в дизайне вашего стола.
3. Проблема четко описана космером. С
case when Asian='Yes' then ... When Black='Yes' then ... When White='Yes' then ... else 'Multiple'
помощью вы получаете «Несколько» для всех строк, где ни одно из значений не равно «Да», и в показанной таблице такой строки нет. Я не считаю, что дизайн таблицы является проблемой, но, поскольку вы хотите обнаружить определенные комбинации, работа с этой таблицей станет довольно неуклюжей, и вместо этого было бы лучше иметь таблицу с одной строкой на идентификатор и атрибут, чтобы вы могли просто агрегировать.4. На моем месте у меня было бы 2 колонки
ID, Ethnicity
только сPRIMARY KEY(ID, Ethnicity)
буквой «а».
Ответ №1:
Проблема в том , что в вашем описании вы используете некоторые AND
, но в своем запросе вы этого не делаете. например, вы говорите, что:
ЕСЛИ Черный-Да, А Другой-Да, То Черный
но case when Black = 'Yes' and Other = 'No' then
в запросе нет соответствия
Вторая проблема заключается в том, что вы недостаточно используете AND
в своем описании. Например.:
ЕСЛИ Азиат-Да, То Азиат
Нет. Если Азиатский-Да, То Либо Азиатский, либо Несколько. Итак, что вы действительно хотите сказать, так это:
Если Азиат-Да, белый-Нет, Черный-Нет, Латиноамериканец-Нет, Тихоокеанский-Нет, Средний-Нет, А Другой-Нет, Тогда Азиат
Если вы точны при описании задачи, часто бывает легко перевести это на SQL. В вашем примере мы могли бы почти использовать точное описание слово в слово. И вот как тогда будет выглядеть ваш запрос:
Select
ID, Asian, Black, White, Hispanic, Pacific, Middle, Other,
case
when Asian = 'Yes'
and White = 'No'
and Black = 'No'
and Hispanic = 'No'
and Pacific = 'No'
and Middle = 'No'
and Other = 'No'
then 'Asian'
when Asian = 'No'
and White = 'No'
and Black = 'Yes'
and Hispanic = 'No'
and Pacific = 'No'
and Middle = 'No'
then 'Black'
...
Однако с другой моделью данных это было бы намного короче. Допустим, ваша таблица посвящена людям, т. е. идентификатор-это идентификатор человека. Тогда у вас будет таблица person
, содержащая по одной строке на человека с его именем и т. Д., Таблица attribute
, содержащая по одной строке на атрибут («Азиат», «Белый» и т. Д.), И одна таблица, относящаяся к человеку с их атрибутами: person_attribute (person_id, attribute_id)
.
Затем вы можете запросить таблицу таким образом:
select
pa.person_id,
case
when count(*) = 1 and max(a.attribute = 'Asian') then 'Asian'
when count(*) = 1 and max(a.attribute = 'Black') then 'Black'
when count(*) = 2 and min(a.attribute = 'Black') and max(a.attribute = 'Other') then 'Black'
...
else 'Multiple'
end as race
from person_attribute pa
join attribute a on a.attributeid = pa.attribute_id
group by pa.person_id;
Комментарии:
1. Спасибо тебе, Торстен.