СЛУЧАЙ, КОГДА с несколькими условиями

#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. Спасибо тебе, Торстен.