SQL查询统计频率

标签 sql sql-server tsql pivot

我有一个表格,里面有类似的条目

id     keywords
1      cat, dog, man, mouse
2      man, pen, pencil, eraser
3      dog, man, friends
4      dog, leash,......

我想做一个类似的表格

id  cat  dog  man  mouse  pen  pencil  eraser  friends  leash ......
1   1    1    1    1      0    0       0       0        0
2   0    0    1    0      1    1       1       0        0
3   0    1    1    0      0    0       0       1        0

等等。

最佳答案

WITH basedata(id,keywords) AS
(
SELECT 1,'cat, dog, man, mouse' union all
SELECT 2 ,'man, pen, pencil, eraser' union all
SELECT 3,'dog, man, friends' union all
SELECT 4,'dog, leash'
),
cte(id, t, x)
     AS (SELECT *,
                CAST('<foo>' + REPLACE(keywords,',','</foo><foo>') + '</foo>' AS XML)
         FROM   basedata)   
SELECT id,
       LTRIM(RTRIM(w.value('.', 'nvarchar(max)'))) as keyword
INTO #Split       
FROM   cte
       CROSS APPLY x.nodes('//foo') as word(w) 


DECLARE @ColList nvarchar(max)

SELECT @ColList = ISNULL(@ColList + ',','') + keyword 
FROM (
SELECT DISTINCT QUOTENAME(keyword) AS keyword
FROM #Split
) T

EXEC(N'       
SELECT *
FROM #Split
PIVOT (COUNT(keyword) FOR keyword IN (' + @ColList + N')) P')

DROP TABLE #Split

给予

id          cat         dog         eraser      friends     leash       man         mouse       pen         pencil
----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- -----------
1           1           1           0           0           0           1           1           0           0
2           0           0           1           0           0           1           0           1           1
3           0           1           0           1           0           1           0           0           0
4           0           1           0           0           1           0           0           0           0

关于SQL查询统计频率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5594430/

相关文章:

mysql - 如何计算 "Average time between first visit and purchase per item_id"

c# - 如果大于 6 个月,则从 SQL Server 中选择记录

sql-server - 创建与 2008 兼容的 SQL Server 2012 数据库

sql - MSSQL 2008 中的行合并,

sql - 获取记录创建之间的平均时间

sql-server - 即使是一个非常简单的查询,我在 SQL Server 中的空间索引仍然需要大量读取。为什么?

java - $_POST 未从 Java 代码接收数据

sql - 在 SQL Server 中获取当前系统时间

sql - 在postgresql中获取当前日期和给定月份之间的日期

SQL - 显示两个日期之间的所有日期