我正在像这样的表格中收集对在线调查表的回复:
CREATE TABLE [Survey]
(
ID int IDENTITY(1,1) NOT NULL,
UserName varchar(50) NOT NULL,
Responses varchar(max) NOT NULL,
Taken datetime NOT NULL
)
[当用户单击提交按钮时,一个过程将捕获所有单击的复选框,并将它们的名称连接成一个定界的字符串,并将其与其他字段一起填充到表中。本质上与:
INSERT INTO [Survey] (UserName, Responses, Taken) VALUES ('John', 'chkSize', GetDate())
INSERT INTO [Survey] (UserName, Responses, Taken) VALUES ('Mary', 'chkSquare;chkSoft', GetDate())
INSERT INTO [Survey] (UserName, Responses, Taken) VALUES ('Steve', 'chkSize;chkYellow;chkRound', GetDate())
INSERT INTO [Survey] (UserName, Responses, Taken) VALUES ('April', 'chkRound;chkStacked;chkFiltered;chkBrown', GetDate())
是否有一种方法可以轻松遍历整个表的所有“响应”,找到所有可能的值,然后将它们作为唯一列表返回到它们自己的表中?即:
chkBrown
chkFiltered
chkRound
chkSize
chkSoft
chkSquare
chkStacked
chkYellow
您可以使用string_split()
执行您想做的事情:
select s.value, count(*)
from survey su cross apply
string_split(su.responses, ';') s
group by s.value;
Here是db <>小提琴。
您可以这样做的事实并不意味着您应该。您应该将响应存储在separate表中,每个响应一行。