Query
編碼問題
我有一個問題,我無法解決。這裡有2張表:
顧客:
| Credit_Card_ind | Credit | Account ID | |-----------------|--------|:----------:| | 1 | 1 | תל אביב | | 1 | 2 | ירושלים | | 2 | 1 | באר שבע | | 2 | 3 | תל אביב | | 3 | 4 | ירושלים | | 4 | 5 | הרצליה |
信用卡:
Credit_card_ind Credit AccountID 0 (no card) 1000 1 1 (card) 5000 2 0 2300 3 1 30000 4
有 5 個問題,但有一個問題:
- 所有總信用超過5000的客戶
- 如果其中一個 accountID 沒有信用卡,則沒有客戶
- 所有信用低於 30000 的 accountID
- 沒有一個(或多個)客戶來自耶路撒冷的賬戶
- 擁有超過 1 個客戶的所有帳戶。
問題是所有這些都必須在一個查詢中,但每個都是一個單獨的組。
我是這樣開始的,但老實說,不知道該怎麼做:
Select *, CASE when b.Credit > 5000 then ‘Condition 1’ When Credit_card_ind = 1 then ‘Condition 2’ When Credit < 30000 then ‘Condition 3’ When a,CityCode is not Jerusalem then ‘Condition 4’ When From customers c Inner join credit_cards cc on c.AccountID = cc.AccountID
先感謝您!
將它們全部放在一個查詢中的要求,而您正在尋找的結果是獨立且不相關的,這當然很奇怪。
不過,您正在尋找的很可能是一個 UNION。聯合本質上連接了任意數量的獨立查詢的結果集,但需要注意的是:每個查詢返回的列的數量和類型必須相同。
例子:
SELECT c.AccountID, 'Condition 1' FROM customers c INNER JOIN credit_cards cc ON c.AccountID = cc.AccountID WHERE cc.credit > 5000 UNION SELECT c.AccountID, 'Condition 3' FROM customers c INNER JOIN credit_cards cc ON c.AccountID = cc.AccountID WHERE cc.credit < 30000
…等等。不幸的是,我不太了解您的許多要求。客戶和帳戶有什麼區別?在“如果沒有客戶”或“在哪裡沒有帳戶”的情況下,您在尋找什麼?實際上相反,匹配的帳戶列表?
我將向您展示使用聚合函式中的子句****過濾器很容易解決此問題。
此範例適用於 Postgresql。
Select array_agg(c.account_id) filter (where c.credit > 500) conditon_1 ,array_agg(c.account_id) filter (where c.credit_card_ind = 1) condition_2 ,array_agg(c.account_id) filter (where c.credit < 3000) condition_3 ,array_agg(c.account_id) filter (where c.city <> 'Jerusalem') condition_4 From customers c Inner join credit_cards cc on c.AccountID = cc.AccountID
我希望我有所幫助