2017-04-19 141 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'條件,並且你將會知道這個查詢是如何工作的。 –