iT邦幫忙

0

SQL語法,如何透過SQL語法統計出每一欄裡以逗號(,)區隔tag出現的次數

問題:如何透過SQL語法統計出每一欄裡以逗號(,)區隔的tag出現的次數

問題sample如下:

https://ithelp.ithome.com.tw/upload/images/20201021/20127643BirfI8o70Y.png

記得將layout1 + layout3,合併後算總次數

例如32559 若兩邊都有出現 就要+2

想要的輸出,透過python解法如下,但想在SQL上實現:

https://ithelp.ithome.com.tw/upload/images/20201021/20127643lUBFwWsQiM.png

但透過python 處理效能較差,且無法直接對應

rogeryao iT邦高手 1 級 ‧ 2020-10-21 13:06:07 檢舉
請至 https://dbfiddle.uk/?rdbms=sqlserver_2017
建立 Table 的範例 , 較易明瞭問題;
32559 出現在 layout1 1 次 , 也出現在 layout3 1 次,
所以是各算 1 次,還是算 2 次 ?
要算2次,
抱歉那邊沒有teradata
我要研究一下,才能 再建一個table try
huwk iT邦新手 4 級 ‧ 2020-10-22 09:41:25 檢舉
提供一個想法.
1.將要找的字代號成''
2.原字串長度減去1代換後的長度
3.2的值除以要找字串的長
4.次數就出來了. 且這樣子內建的函數就能快速的在TSQL中處理掉了.

找了一下.網上應有不少人有例子.可以加工修改成自己要的

https://hanjay.pixnet.net/blog/post/30025506-sql%E6%9F%A5%E8%A9%A2%E7%89%B9%E5%AE%9A%E5%AD%97%E4%B8%B2%E5%87%BA%E7%8F%BE%E7%9A%84%E6%AC%A1%E6%95%B8

2 個回答

0
rogeryao
iT邦高手 1 級 ‧ 2020-10-21 14:50:15
CREATE TABLE [dbo].[recommend_v1] (
[filedate] varchar(40) NULL ,
[layout1] varchar(40) NULL ,
[layout3] varchar(40) NULL );
--
INSERT INTO [dbo].[recommend_v1] ([filedate], [layout1], [layout3]) 
VALUES (N'QQ', N'A,B,X,Y,Z,F,G,X,Y,Z,F,G',N'A,B,C,D,E,F,G,A,B,C,D');
INSERT INTO [dbo].[recommend_v1] ([filedate], [layout1], [layout3]) 
VALUES (N'RR', N'A,B,C,D,E,F,G,A,B,C,D',N'P,Q,R,D,E,F,G,R,D,E,F,G');
INSERT INTO [dbo].[recommend_v1] ([filedate], [layout1], [layout3]) 
VALUES (N'TT', N'P,Q,R,D,E,F,G,R,D,E,F,G',N'A,B,X,Y,Z,F,G,X,Y,Z,F,G');
-- case 1: 依 tag 計數
SELECT C.value AS tag,COUNT(C.value) AS counter
FROM recommend_v1 AS B
-- 將 layout1+','+layout3 併成 Newlayout ,同時依 ',' 字元拆成多筆資料
CROSS APPLY STRING_SPLIT(B.layout1+','+layout3, ',') AS C
GROUP BY C.value
ORDER BY C.value
-- case 2 : 依 filedate 及 tag 計數
SELECT filedate,C.value AS tag,COUNT(C.value) AS counter
FROM recommend_v1 AS B
-- 將 layout1+','+layout3 併成 Newlayout ,同時依 ',' 字元拆成多筆資料
CROSS APPLY STRING_SPLIT(B.layout1+','+layout3, ',') AS C
GROUP BY filedate,C.value
ORDER BY filedate,C.value

Demo

0
fuzzylee1688
iT邦新手 1 級 ‧ 2020-10-21 16:21:23

刪...

我要發表回答

立即登入回答