我有一列與每個客戶相關聯的客戶標簽(用逗號分隔)。
我需要在 ClientLabels 列中找到具有多于或少于 1 個狀態的客戶。換句話說,找到需要添加狀態(當根本沒有指定狀態時)或洗掉(當指定額外狀態時,通常發生在客戶端移出狀態或員工錯誤時)的例外。
我們可以服務的所有州:加利福尼亞、亞利桑那、德克薩斯、弗吉尼亞和華盛頓。
PS 如果客戶端移動到不在上述串列中的任何州,它會立即變為非活動狀態,因此阿拉斯加(例如)不可能出現在 ClientLabels 列中。
CREATE TABLE Clients
(ClientId INT, ClientName VARCHAR(100), ClientLabels VARCHAR(max));
INSERT INTO Clients
VALUES
(1 , 'Justin Bieber', 'California, Musician, Male'),
(2 , 'Lionel Messi', 'Washington, Soccer Player, Male'),
(3 , 'Nicolas Cage', 'California, Actor, Male'),
(4 , 'Harry Potter', 'Fake, Male'),
(5 , 'Tom Holland', 'Arizona, Actor, California, Male'),
(6 , 'Ariana Grande', 'Texas, Musician, Female'),
(7 , 'Madonna', 'Virginia, Musician, Female'),
(8 , 'Dwayne Johnson', 'California, Actor, Male')
SELECT * FROM Clients
我需要的輸出:
| 客戶 ID | 客戶名稱 | 客戶標簽 | 狀態數 |
|---|---|---|---|
| 1 | 賈斯汀比伯 | 加州, 音樂家, 男 | 1 |
| 2 | 萊昂內爾·梅西 | 華盛頓, 足球運動員, 男 | 1 |
| 3 | 尼古拉斯·凱奇 | 加州, 演員, 男 | 1 |
| 4 | 哈利波特 | 假的,男的 | 0 |
| 5 | 湯姆·霍蘭德 | 亞利桑那州,演員,加利福尼亞州,男 | 2 |
| 6 | 格蘭德阿麗亞娜 | 德克薩斯州, 音樂家, 女性 | 1 |
| 7 | 麥當娜 | 弗吉尼亞,音樂家,女 | 1 |
| 8 | 德韋恩·約翰遜 | 加州, 演員, 男 | 1 |
我已經開始了代碼,但不知道如何完成它:
SELECT c.*,
COUNT(c.ClientLabels) OVER(PARTITION BY c.ClientId) AS NumberOfStates
FROM Clients AS c
uj5u.com熱心網友回復:
您可以嘗試以下查詢。
declare @Clients table(ClientId INT, ClientName VARCHAR(100), ClientLabels VARCHAR(max))
declare @labels table(label varchar(100))
insert into @Clients
VALUES
(1 , 'Justin Bieber', 'California, Musician, Male'),
(2 , 'Lionel Messi', 'Washington, Soccer Player, Male'),
(3 , 'Tom Holland', 'Arizona, Actor, California, Male'),
(4 , 'Harry Potter', 'Fake, Male')
insert into @labels
values('California')
,('Arizona')
,('Texas')
,('Virginia')
,('Washington')
select distinct c.*,case when cl.label is null then 0
else count(*)over(partition by clientid order by clientid) end as [NumberOfStates]
from @Clients c
left join @labels cl
on c.ClientLabels like '%' cl.label '%'
uj5u.com熱心網友回復:
如果您的 sql server 版本支持STRING_SPLIT功能,您可以嘗試STRING_SPLIT與CROSS APPLYsplit ClientLabelsby commna each一起使用ClientId。
然后使用條件聚合函式計數NumberOfStates
SELECT ClientId,
ClientName,
ClientLabels,
COUNT(CASE WHEN trim(v.value) IN ('California','Arizona', 'Texas', 'Virginia', 'Washington') THEN 1 END) NumberOfStates
FROM Clients c
CROSS APPLY STRING_SPLIT(c.ClientLabels,',') v
GROUP BY ClientId,ClientName,ClientLabels
sqlfiddle
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/441792.html
