这是我的表结构:
CUST_ID ORDER_MONTH
---------------------
1 1
1 5
2 3
2 4
我的目标是将这些客户标记为新客户或回头客。
当我过滤查询时,请说明第1个月,然后客户1应该标记为“新”,但是当我过滤第5个月时,客户1应该显示为“返回”,因为他已经在第1个月进行了购买
同样,客户ID 2应显示为第3个月的新功能,并在第4个月返回。
我想使用CASE语句而不是内连接来执行此操作。
由于
答案 0 :(得分:0)
你不需要JOIN,案例陈述可能有点过分......
SELECT CUST_ID, IF(COUNT(1)>1, 'Returning', 'New') AS blah
FROM the_table
WHERE ORDER_MONTH <= the_month
GROUP BY CUST_ID
;
当然,仅用一个月就会在一年后(或者真的是在经过十二月之后)引起问题。
这样会更好
SELECT CUST_ID, IF(COUNT(1)>1, 'Returning', 'New') AS blah
FROM the_table
WHERE order_date <= some_date
GROUP BY CUST_ID
;
答案 1 :(得分:0)
嗯,我不这样推荐,但这就是你想要的。
select *
,case when order_month = (select MIN(order_month) from #temp t2 where t1.cust_ID =t2.cust_id) THEN 'NEW' ELSE 'Return' end 'Type'
from #temp t1
答案 2 :(得分:0)
我想我得到了你想做的事。您的案例陈述基本上只需要检查客户的月份是否等于您过滤的月份。像这样:
lsblk
答案 3 :(得分:0)
尝试此查询
select a.CUST_ID, a.ORDER_MONTH ,case when b is not null then 'Return' else 'New' end as type
from tablename a
join tablename b on a.CUST_ID=b.CUST_ID and a.ORDER_MONTH>b.ORDER_MONTH
答案 4 :(得分:0)
如果你坚持使用case语句,那么逻辑就像&#34;如果这是该用户的第一个月,写新的,否则写回。&#34;查询如下:
MsoButtonStyle.msoButtonIcon
但是,我认为这在SELECT CASE
WHEN m.month = (SELECT MIN(month) FROM myTable WHERE customer = m.customer) THEN 'New'
ELSE 'Returning' END AS customerType
FROM myTable m;
中会更好,更具可读性。您可以编写聚合查询以获取每个用户的最早月份,然后使用JOIN
将空值替换为&#39;返回&#39;。聚合:
COALESCE()
要完成其余的事情:
SELECT customer, MIN(month) AS minMonth, 'New' AS customerType
FROM myTable
GROUP BY customer ;
这是一个显示两个示例的SQL Fiddle示例。
答案 5 :(得分:0)
SELECT *,
CASE
WHEN EXISTS (SELECT *
FROM [YourTable] t2
WHERE t1.cust_id = t2.cust_id
AND t2.order_month < t1.order_month) THEN 'Return'
ELSE 'New'
END
FROM [YourTable] t1
此查询在EXISTS子句上使用CASE。 EXISTS位于子查询上,该子查询在同一个表中查询前几个月中的任何行。 如果前几个月有行,那么EXISTS为真,CASE返回&#39; Return&#39;。如果前几个月没有行,则EXISTS为false,CASE返回&#39; New&#39;。