我有一个带有userid,productid和reviewScore的sql表,记录超过1000万条。我们可以想象userid和productid组合是独一无二的。我需要找到100 * 100用户ID和产品ID的矩阵及其评论分数。
示例输入表 - 这里的第一个问题是需要识别1000万行中常见的100个用户ID和产品组合,这些行具有评论并且基于矩阵形式进行转换。
productId将形成动态枢轴元素。
输入 表1
UserID ProductId ReviewScore
User1 Product1 1
User1 Product2 2
User1 Product3 1
User1 Product4 3
User1 Product5 5
User2 Product1 3
User2 Product2 4
User2 Product3 5
User2 Product4 2
User2 Product5 5
User3 Product1 1
User3 Product2 3
User3 Product3 5
User3 Product4 3
User3 Product5 4
User4 Product1 3
User4 Product2 3
User4 Product3 3
User4 Product4 4
User4 Product5 4
User5 Product1 2
User5 Product2 2
User5 Product3 2
User5 Product4 3
User5 Product5 3
我需要的输出。
UserId Product1 Product2 Product3 Product4 Product5
User1 1 2 1 3 5
User2 3 4 5 2 5
User3 1 3 5 3 4
User4 3 3 3 4 4
User5 2 2 2 3 2
此处输出应为100 * 100 usesrid * product id,并将评分作为值。这个想法是最小稀疏或0值。
我必须在sql server中编写相同的查询。 任何帮助表示赞赏。
答案 0 :(得分:1)
在pivote
中使用dynamic sql
:
DECLARE @prods AS NVARCHAR(MAX)
DECLARE @query AS NVARCHAR(MAX)
select @prods = STUFF((SELECT ',' + QUOTENAME(ProductId)
from tab
--where limit the products here
group by ProductId
order by ProductId
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = 'SELECT * from
(
select UserID, ProductId, ReviewScore
from tab --here also you can limit the products and users by where clause
) x
pivot
(
sum(ReviewScore)
for ProductId in (' + @prods + ')
) p '
EXECUTE(@query)