2017-01-18 22 views
-1

我有一個要求,我想從表CLIENT中拉出所有列,只有表CLIPHONE中的電話號碼。對於電話號碼,某些客戶在CLIPHONE中列出了多個電話號碼,但我只需要一個電話號碼。因此,如果客戶的描述中列出了他們的「小區」或「移動」,那麼我需要具有最小序列值的數字。如果未列出蜂窩或移動我想要的序列設定爲1個sql查詢完整的外部,案例當在哪裏

實施例:在CLIPHONE

喬伊A - 的clientid = 25,sourceloc = 1,電話= 1234567890,描述=家,序列= 1

喬伊A - 的clientid = 25,sourceloc = 1,電話= 0987654321,描述=細胞,序列= 2

喬伊A - 的clientid = 25,sourceloc = 1,電話= 1111111111,描述=移動,序列= 3

然後當我運行查詢我希望電話號碼0987654321能夠顯示來自CLIENT的列,因爲它包含單詞「cell」,並且序列比序列3中的'mobile'更低。如果序列號爲#2的手機在描述中有word office,那麼我希望序列3顯示在查詢結果中,因爲它現在是單詞「cell」或「mobile」中的最低字符

如果兩個序列2和3變成了「其他」,那麼我想讓序列1出現,因爲沒有其他序列具有「細胞」或「移動」。

隨着我的查詢我收到此錯誤: 消息147,15級,狀態1,5號線 聚合不應出現在WHERE子句中,除非它是包含在HAVING子句或選擇列表中的子查詢,並且被聚合的列是外部參考。

SELECT DISTINCT TOP 1000 cp.phone, c.* 
FROM CLIENT C 
FULL OUTER JOIN CLIPHONE CP 
ON c.clientid = cp.clientid AND c.sourceloc = cp.sourceloc 
WHERE cp.sequence = CASE WHEN (description LIKE '%mobile%' OR description LIKE '%cell%') THEN min(sequence) ELSE 1 END 
ORDER BY sourceloc, clientid 

這裏是我的表:

CLIPHONE

CLIENT

+0

請提供相關表格的模式。謝謝 –

+2

樣本數據和預期結果將確實有助於傳達您正在嘗試執行的操作。 –

+0

@Joey - 你的回答必須以問題的形式出現。發生什麼事?你想要發生什麼? – Malvolio

回答

0
with phones as (
    select *, 
     row_number over (
      partition by cp.clientid 
      order by 
       case when cp.description in ('cell', 'mobile') then 1 else 2 end, 
       cp.sequence 
     ) as rnk 
    from CLIENT c inner join CLIPHONE cp 
     on cp.clientid = c.clientid and cp.sourceloc = c.sourceloc 
) 
select * from phones where rnk = 1; 

我懷疑你真的需要一個完整的外部聯接。即使您將其添加回來,查詢應該仍然可以正常工作。