一组100个用户和100个产品sql查询

时间:2015-04-05 18:13:44

标签: sql sql-server

我有一个带有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中编写相同的查询。 任何帮助表示赞赏。

1 个答案:

答案 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)

Fiddle Demo