簡體   English   中英

sql 查詢 FULL OUTER,CASE WHEN 在 WHERE

[英]sql query FULL OUTER, CASE WHEN in WHERE

我有一個要求,我想從表 CLIENT 中提取所有列,並且只從表 CLIPHONE 中提取電話號碼。 對於電話號碼,有些客戶在 CLIPHONE 中列出了多個電話號碼,但我只想要一個電話號碼。 因此,如果客戶在描述中列出了他們的“單元”或“移動”,那么我想要具有最小序列值的數字。 如果未列出 cell 或 mobile,則我希望將序列設置為 1

示例:在 CLIPHONE 中

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

Joey A - clientid = 25,sourceloc = 1,電話 = 0987654321,描述 = 單元格,序列 = 2

Joey A - clientid = 25,sourceloc = 1,phone = 1111111111,description = mobile,sequence = 3

然后,當我運行查詢時,我希望電話號碼 0987654321 與來自 CLIENT 的列一起顯示,因為它包含單詞“cell”,並且比包含“mobile”的序列 3 的序列低。 如果序列 #2 的電話在描述中包含 office 一詞,那么我希望序列 3 顯示在查詢結果中,因為它現在是最低的,其中包含單詞“cell”或“mobile”

如果序列 2 和 3 都更改為“其他”,那么我希望序列 1 出現,因為沒有其他序列具有“單元”或“移動”。

通過我的查詢,我收到此錯誤:Msg 147, Level 15, State 1, Line 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

這是我的表:

夾子

客戶

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;

我懷疑您是否真的需要完整的外部聯接。 即使您將其添加回來,該查詢也可能仍然有效。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM