编写sql查询来计算产品

时间:2017-11-11 07:01:16

标签: mysql sql sql-server sql-server-2008 tsql

这是一个包含三列的表:user_id,product_id,rating,

这是表格:

user_id    product_id    rating
u0         p0            3
u0         p1            2
u1         p0            1
u1         p1            4
u2         p0            2
u2         p1            3

如果两个不同的客户都评价相同的两个产品,那么计算其评级的点积如下: u0和u1均为额定乘积p0和p1,结果应为:3 * 1 + 2 * 4 = 11

和结果表:

u0  u1  3*1+2*4=11 
u0  u2  3*2+2*3=12 
u1  u2  1*2+4*3=14 

如何编写查询以获取它?

3 个答案:

答案 0 :(得分:2)

T-SQL / SQL Server

DECLARE @DataSource TABLE
(
    [user_id] VARCHAR(2)
   ,[product_id] VARCHAR(2)
   ,[rating] DECIMAL(9,2)
);


INSERT INTO @DataSource ([user_id], [product_id], [rating])
VALUES ('u0', 'p0', 3)
      ,('u0', 'p1', 2)
      ,('u1', 'p0', 1)
      ,('u1', 'p1', 4);

WITH DataSource AS
(
    SELECT [product_id]
          ,EXP(SUM(LOG([rating]))) AS [value]
    FROM @DataSource
    GROUP BY [product_id]
)
SELECT SUM([value])
FROM DataSource;

答案 1 :(得分:1)

所需结果的前两列毫无意义 - 如果有多个用户会怎么样?

所以,忽略那一点......

SELECT ROUND(SUM(subtotal)) total 
  FROM
     ( SELECT product_id
     , EXP(SUM(LOG(rating))) subtotal
  FROM my_table
 GROUP 
   BY product_id
  ) n;

Sqlfiddle相同:http://sqlfiddle.com/#!9/3c9dac/3

哦,这几乎与之前的答案完全相同。正如它首先发布的那样,如果您有意接受这一点,请接受它。

答案 2 :(得分:0)

MySQL解决方案:

SELECT SUM(m.product_rating)
FROM (
    SELECT EXP(SUM(LOG(COALESCE(rating,1))) AS product_rating
    FROM table
    GROUP BY product_id
    /*this query multiplies the ratings by product*/
) AS m
GROUP BY NULL

修改

如果您只想要某些产品,请添加

WHERE product_id IN('p0', 'p1', ...)

在内部查询中。 如果您只想要某些用户,请添加

WHERE user_id IN('u0', 'u1', ...)
外部查询中的