簡體   English   中英

如何在MSSQL中按逗號分隔的列分組?

[英]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.

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