Query

編碼問題

  • January 17, 2020

我有一個問題,我無法解決。這裡有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 個問題,但有一個問題:

  1. 所有總信用超過5000的客戶
  2. 如果其中一個 accountID 沒有信用卡,則沒有客戶
  3. 所有信用低於 30000 的 accountID
  4. 沒有一個(或多個)客戶來自耶路撒冷的賬戶
  5. 擁有超過 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

我希望我有所幫助

引用自:https://dba.stackexchange.com/questions/257269