选择SQL逻辑
乡亲们在这里不知所措选择SQL逻辑,sql,sql-server-2012,Sql,Sql Server 2012,乡亲们在这里不知所措 首先,这是我努力实现的目标: 从如下所示的表CUSTOMER\u ORDER\u DETAILS表中选择所有记录,如果同一客户不存在多个条目,则: -选择PAID=1的条目 -如果有多个PAID=1条目,则选择类型为Y的记录 预期结果: 877,CU115,发光,0,1,X 878,CU111,Toi,1,1,Y 879,CU117,佛罗里达州,1,1,X 我的方法是使用GROUPBY on CUSTOMER_NO获得count(CUSTOMER_NO)>1,但一旦我将
首先,这是我努力实现的目标:
从如下所示的表CUSTOMER\u ORDER\u DETAILS表中选择所有记录,如果同一客户不存在多个条目,则:
-选择PAID=1的条目
-如果有多个PAID=1条目,则选择类型为Y的记录
预期结果:
877,CU115,发光,0,1,X
878,CU111,Toi,1,1,Y
879,CU117,佛罗里达州,1,1,X
我的方法是使用GROUPBY on CUSTOMER_NO获得count(CUSTOMER_NO)>1,但一旦我将表的其余列添加到Select语句中,count列就会显示值1。
任何解决此问题或实现if else逻辑的指针?您可以在
行数
函数中使用按顺序
条件对这些条件进行优先级排序
select * from (
select t.*,
row_number() over(partition by customer_no
order by case when paid=1 and type='Y' then 1
when paid=1 then 2
else 3 end) as rnum
from customer_orders t
) t
where rnum=1
- 如果同一客户号存在多个paid=1的行,则假定每个客户号只能有一行,且类型为='Y'
- 如果存在多个paid=1的行,且所有行的类型均为“Y”,则会在其中任意选取一行
select t.*
from (select t.*,
row_number() over (partition by customer_no
order by paid desc, type desc
) as seqnum
from t
) t
where seqnum = 1;
这假设
paid
具有值0和1,并且type
具有值X
和Y
mysql或sql server?最简单的解决方案是剖析您的逻辑并将它们组合起来,请尝试使用firstGordon,谢谢您的帮助。我们来读一下优先级查询。你能解释一下逻辑吗?这可能也会帮助其他人。@user1195192。运行子查询,您将看到发生了什么。您想要的行以seqnum
作为“1”结尾。vkp,非常感谢。你能解释一下逻辑吗?这可能会帮助其他人well@user1195192 .. 我建议您在row\u number
中尝试不同的order by
条件,您将了解此查询的工作原理。