首先让我说我是编程新手。我有一个关于在Excel中使用IF / THEN语句进行分类的问题。我有这个:
visit_id action
1 sale
1 sale
1 sale
2 service
2 service
3 sale
3 sale
3 service
我想得到这个:
visit category
1 sale
2 service
3 both
感谢任何帮助!
答案 0 :(得分:3)
在以下情况下尝试使用案例:
SELECT visit_id,
CASE
WHEN Sum(CASE
WHEN action = 'sale' THEN 1
ELSE 0
END) = Count(*) THEN 'sale'
WHEN Sum(CASE
WHEN action = 'service' THEN 1
ELSE 0
END) = Count(*) THEN 'service'
ELSE 'both'
END
FROM table
--WHERE action in('sale','service')
GROUP BY visit_id
假设您只有两种类型action
,即sale
和service
。
答案 1 :(得分:0)
嗯..有人开始在选择中写CASE,但后来删除了他的答案,我不知道为什么......那是CASE的用途,但你还需要另一步。
T-SQL方言中的示例:
第1步:
select
visit_id,
case action when 'sale' then 1 else 0 end as actionIsSale,
case action when 'service' then 1 else 0 end as actionIsService
from fooTable
第2步:
select
visit_id,
max(actionIsSale) as hasSale,
max(actionIsService) as hasService
from (previousquery)
group by visit_id
第3步:
select
visit_id as visit,
case
when hasSale='1' and hasService='0' then 'sale'
when hasSale='0' and hasService='1' then 'service'
when hasSale='1' and hasService='1' then 'both'
else '!WTF!'
end as category
from (previousquery)
总结:
select
step2.visit_id as visit,
case
when step2.hasSale='1' and step2.hasService='0' then 'sale'
when step2.hasSale='0' and step2.hasService='1' then 'service'
when step2.hasSale='1' and step2.hasService='1' then 'both'
else '!WTF!'
end as category
from
(
select
step1.visit_id,
max(step1.actionIsSale) as hasSale,
max(step1.actionIsService) as hasService
from
(
select
visit_id,
case action when 'sale' then 1 else 0 end as actionIsSale,
case action when 'service' then 1 else 0 end as actionIsService
from fooTable
) as step1
group by step1.visit_id
) as step2
注意#1:将部件粘合在一起时,我直接将这些步骤用作子查询,因此我必须指定别名(as step1
,as step2
等)。这是T-SQL / SqlServer中的特定要求,您的数据库可能不在乎,但这无论如何都是好事。
注意#2:如果您不喜欢这样的子查询,您可以轻松地将所有子查询分成临时表或CTE或其他任何内容;重要的是在短步骤和简单操作中执行数据转换的想法
注意#3:这段代码可能有轻微的缺陷和语法错误,我已经一次性编写并且没有尝试执行它。但是你现在应该有了整体想法,并且应该很容易遵循并纠正任何位。
注意#4:在您了解它的工作原理之后,您可以尝试将其打包到更短的查询中,即将Step2和Step3折叠为单个表达式,并且您会注意到它可以打包它与Step1一样,在一个查询中完成所有这些操作。你会得到像 Deepak Pawar 这样的东西。而我的解决方案"与他相比可能看起来过于膨胀,特别是对于这个简单的问题,"扩展到新的列并聚合"诀窍适用于许多更复杂的情况;)