2017-04-19 106 views
1

在这里茫然的人!
首先,这就是我想实现:选择SQL逻辑


选择从表CUSTOMER_ORDER_DETAILS表所示的所有记录,如果存在,那么对于同CUSTOMER_NO多个条目:
- 选择条目有偿= 1
- 如果有多个PAID = 1个条目,然后用TYPE =选择记录ÿ

Table

预期结果:
877,CU115,点燃,0,1,X
878,CU111,布袋,1,1,Y
879,CU117,佛罗里达州,1,1,X

我的方法是让在CUSTOMER_NO上使用GROUP BY计数(CUSTOMER_NO)> 1,但是只要我将表的剩余列添加到Select语句,计数列显示的值就是1. 解决此问题的任何指针或实现if-其他种类的逻辑?

+0

mysql或sql-server? –

+0

最简单的解决方案是解剖你的逻辑,并结合他们尝试第一个 – maSTAShuFu

回答

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

+0

戈登,感谢您的帮助。去阅读优先级查询一下。你介意一点点解释逻辑吗?这也可以帮助其他人。 – user1195192

+1

@ user1195192。 。 。运行子查询,你会看到会发生什么。你想要的结果是“seqnum”为“1”。 –

+0

谢谢..要阅读它。 – user1195192

1

您可以使用row_number函数中的order by条件优先考虑这些条件。

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”每CUSTOMER_NO如果存在多个行与该同一个CUSTOMER_NO支付= 1。
  • 如果存在多个支付= 1的行,并且它们都有一个类型<>'Y',那么在它们之间任意挑选一行。
+0

vkp,非常感谢。你介意一点点解释逻辑吗?这可能也会帮助其他人 – user1195192

+1

@ user1195192 ..我建议你在'row_number'中尝试不同的'by by'条件,并且你将会知道这个查询是如何工作的。 –