[英]How to group by comma delimited column in mssql?
我有桌子
T1(用戶)
Id Name CourseIds
1 Joel 1,2,3
2 Jeff 2,3,4
T2(課程)
CourseId CourseName
1 C#
2 Javascript
3 SQL
4 VB
我必須將兩個表合並起來,並找出每門課程的數量-由用戶(分組依據)(如結果表)學習
Courses Count
C# 1
Javascript 2
SQL 2
VB 1
我已經嘗試過與問題相關的stackoverflow答案,但它們無濟於事。 請幫我。
首先,您應該修復數據結構。 將ID列表存儲在以逗號分隔的列表中是很糟糕的,原因有很多:
有時我們被其他人的錯誤決定所困。 在這種情況下,盡管效率不高,但是您可以做自己想做的事情:
select c.coursename,
(select count(*)
from user u
where ',' + u.courseids + ',' like '%,' + cast(c.id as varchar(255)) + ',%'
) as cnt
from courses c;
但實際上,固定數據結構比合並奧秘的字符串操作更好。
With cte(courseids,si,ei)
As(
Select courseids,
1,
charindex(',', courseids)
From user
Union all
Select courseids,
Cast( 1 +ei as int),
Charindex(',',courseids,1+ei)
From cte
Where ei >0
)
Select substring(courseids,si, case when ei>0 then ei- si else Len(courseids) end) as courseid into #t
From cte;
Select count(1) as count, (select coursename from courses where courseid = t.courseid) as courses
From #t t
Group by courseid;
Drop table #t;
回答遲了,但您也可以這樣進行
DECLARE @Table1 TABLE
(Id int, Name varchar(4), CourseIds varchar(5))
;
INSERT INTO @Table1
(Id, Name, CourseIds)
VALUES
(1, 'Joel', '1,2,3'),
(2, 'Jeff', '2,3,4')
;
DECLARE @Table2 TABLE
(CourseId int, CourseName varchar(10))
;
INSERT INTO @Table2
(CourseId, CourseName)
VALUES
(1, 'C#'),
(2, 'Javascript'),
(3, 'SQL'),
(4, 'VB')
;
declare @str varchar(max)
;with cte as (
SELECT Id,Name,
Split.a.value('.', 'VARCHAR(100)') AS Courseid
FROM (SELECT Id,Name,
CAST ('<M>' + REPLACE([CourseIds], ',', '</M><M>') + '</M>' AS XML) AS String
FROM @Table1) AS A CROSS APPLY String.nodes ('/M') AS Split(a))
select TT.CourseName,COUNT(C.Courseid) AS Courseid from cte C
INNER JOIN @Table2 TT
ON TT.CourseId = C.Courseid
GROUP BY TT.CourseName
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.