Создание дополнительных столбцов на основе условия (случай, когда сумма) - PullRequest
0 голосов
/ 27 февраля 2020

У меня есть опросная таблица, где кому-то задают примерно 5 вопросов. 4 из этих вопросов - это одни и те же вопросы, но варианты их ответов различны, поскольку они должны были понять свою покупку.

Вот вопросы:

 ID                Question                            qid                         Answer
 101005 what brands did you purchase the past 5 months  1          Coca-Cola or Pepsi or Dr.Pepper
 101005 what brands did you purchase the past 5 months  1                       Dr.Pepper
 101005 what brands did you purchase the past 5 months  1                      store brand
 101005 what brands did you purchase the past 5 months  1                      Coca-Cola
 101005  how many people live in your house             4                           4
 101005  what is your prefer retailers                  8                          walmart 

Цель состоит в том, чтобы создать четыре дополнительных столбца на основе их ответа, и им будет присвоено 1 или 0. Поскольку ответ этого человека - кока-кола, я хочу назначить их в столбце current_buyer и дать им 1, а 0 будет столбцом new_buyer. Я также хочу убедиться, что, хотя он отвечает доктору Пепперу во втором ряду, он все равно распознает его как current_buyer. На одном дыхании я хочу назначить этому человеку 1 в 3-м столбце в качестве пьющего и 0 4-й столбец в перспективе.

Вот как должна выглядеть таблица

  ID             Question                             qid               answer                    Current_buyer    New_buyer   drinker    prospect      
 101005 what brands did you purchase the past 5 months  1        Coca-Cola or Pepsi or Dr.Pepper      1               0             1        0
 101005 what brands did you purchase the past 5 months  1                       Dr.Pepper             1               0             1        0
 101005 how many people live in your house              4                            4                1               0             1        0

Цель состоит в том, чтобы узнать, купили ли ID кока-колу за последние 5 месяцев, они являются текущим покупателем (1) и пьяницей (1) и будут иметь (0) для new_buyer и проспекта во всем своем профиле.

Здесь это код, который я пробую:

 select ID,qid,question,answer,s_date,   
 Case when Sum(Case when [answer] like'%coca-cola%' then 1 else 0 end)>=1 then 1 
 else 0 end  current_buyer
 ,Case when Sum(Case when [answer] like'%coca-cola%' then 1 else 0 end)=0 then 1 
  else 0 end  New_buyer 
 ,Case when Sum(Case when [answer] like'%coca-cola,Dr.pepper,pepsi%' then 1 else 0 end)>=1 then 1 
  else 0 end  drinker
 ,Case when Sum(Case when [answer] like'%coca-cola,Dr.pepper,pepsi%' then 1 else 0 end)=0 then 1 
  else 0 end  Prospect

К сожалению, используя этот код, я получаю 0 в столбце пьющего, хотя люди выбирают кока-колу. Любая помощь будет оценена.

1 Ответ

1 голос
/ 27 февраля 2020

Я не уверен на 100%, что я понимаю логику c, стоящую за назначением различных значений, но в целом кажется, что вы назначаете значение на основе объединения нескольких строк. Поэтому вам нужно сначала выполнить агрегирование (в данном случае в CTE), а затем присоединиться к нему для вашего запроса.

Также стоит отметить, что даже если вы выполняете сопоставление с оператором LIKE - все между символами [%] должно совпадать где-то в вашем [ответе] Я не думаю, что это то, что вы хотите - поэтому я разделил их. Однако я не уверен на 100%, правильно ли я понял логические операторы.

Вам нужно что-то вроде:

;with analysisCTE as (select ID,qid,   
     Case when Sum(Case when [answer] like'%coca-cola%' then 1 else 0 end)>=1 then 1 
     else 0 end  current_buyer
     ,Case when Sum(Case when [answer] like'%coca-cola%' then 1 else 0 end)=0 then 1 
      else 0 end  New_buyer 
     ,Case when Sum(Case when [answer] like'%coca-cola%' OR [answer] like '%Dr.pepper%' OR [answer] like '%pepsi%' then 1 else 0 end)>=1 then 1 
      else 0 end  drinker
     ,Case when Sum(Case when [answer] like'%coca-cola%' OR [answer] like '%Dr.pepper%' OR [answer] like '%pepsi%' then 1 else 0 end)=0 then 1 
      else 0 end  Prospect
    from drinks
    group by id, qid)
select d.ID,d.qid,d.question,d.answer, a.current_buyer, a.New_buyer, a.drinker, a.Prospect
from drinks d
inner join analysisCTE a on d.id = a.id and d.qid = a.qid
...