选择SQL逻辑

时间:2017-04-19 23:19:38

标签: sql sql-server-2012

人们不知所措!!!
首先,这是我想要实现的目标:

从下面显示的表CUSTOMER_ORDER_DETAILS表中选择所有记录,如果存在相同CUSTOMER_NO的多个条目,则:
- 选择PAID = 1的条目 - 如果有多个PAID = 1个条目,则选择TYPE = Y

的记录

Table

预期结果:
877,CU115,点亮,0,1,X
878,CU111,Toi,1,1,Y
879,CU117,Fla,1,1,X

我的方法是获得计数(CUSTOMER_NO)> 1在CUSTOMER_NO上使用GROUP BY,但只要我将表的其余列添加到Select语句,count列就会显示值1。 有任何指针可以解决这个问题或实现if-else类型的逻辑吗?

2 个答案:

答案 0 :(得分:1)

您可以在order by函数中使用row_number条件确定这些条件的优先级。

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
  • 这假设只有一行类型=' Y' per customer_no如果对于同一个customer_no存在多个具有paid = 1的行。
  • 如果存在多行且pay = 1且所有行都具有类型<> ' Y'然后在它们之间任意挑选一行。

答案 1 :(得分:1)

这是优先级查询。这是一种做你想做的事情的方法:

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的值为XY