CASE语句而不是内连接

时间:2015-07-09 18:08:14

标签: mysql sql logic

这是我的表结构:

CUST_ID  ORDER_MONTH
---------------------
 1       1
 1       5
 2       3
 2       4

我的目标是将这些客户标记为新客户或回头客。

当我过滤查询时,请说明第1个月,然后客户1应该标记为“新”,但是当我过滤第5个月时,客户1应该显示为“返回”,因为他已经在第1个月进行了购买

同样,客户ID 2应显示为第3个月的新功能,并在第4个月返回。

我想使用CASE语句而不是内连接来执行此操作。

由于

6 个答案:

答案 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;。