根据条件创建额外的列(求和时)

时间:2020-02-27 01:58:16

标签: sql sql-server if-statement sum case

我有一个调查表,其中有人被问到大约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列。我还想确保即使他在第二行回答了Dr.Pepper,它仍然将他识别为current_buyer。同样,我想在第3列中将此人分配为饮酒者,在潜在客户中将第4列分配为0。

这是表格的外观

  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 个答案:

答案 0 :(得分:1)

我不是100%确定我理解分配各种值背后的逻辑,但总的来说,您似乎是基于多个行的聚合来分配值。因此,您需要先进行汇总(在本例中为CTE),然后再加入查询中。

还值得注意的是,即使您正在使用LIKE运算符进行匹配-[%]字符之间的所有内容都需要与[answer]中的某处完全匹配。我认为这不是您想要的-所以我将它们分开了。但是,我不确定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