0

所以我有一张桌子,我试图得到 SUM(activity_weight) WHERE activity_typeid 是唯一的。

每场比赛都有无限数量的activity_typeid。

正如您在下面的代码中看到的那样,我想知道是否有一些 SQL 函数可以找到 ID 是唯一的东西的总和?

感谢您的任何帮助!

我在下面附上了一张桌子的照片和所需的输出

在此处输入图像描述

 SELECT a.userid, u.name, u.profilePic , 
  SUM(activity_weight) AS totalPoints , 

  //sum the points when the activity_typeid is unique and make an extra column for each of those sums
  SUM(CASE WHEN activity_typeid //is unique// THEN activity_weight    ELSE NULL END) AS specific_points , 

  FROM activity_entries a INNER JOIN users1 u ON u.id = a.userid 

  WHERE competitionId = '$competitionId' GROUP BY a.userid ORDER BY totalPoints
4

3 回答 3

0
SELECT SUM(something), ... FROM table t1 WHERE NOT EXISTS
(
    SELECT id FROM table t2 WHERE t1.id <> t2.id AND t1.checkfield = t2.checkfield
)
GROUP BY ...

基本上,您想要选择在检查字段中具有值的所有记录的总和,其中不存在该字段具有相同值的记录。这样做很简单:只需查看同一张表中是否有一条记录具有相同的值但不同的 id。

但是,我不确定这是您想要的。这只是总结了独特的记录。如果活动 id 不是唯一的,则根本不包括在内,甚至一次也不包括在内。

于 2013-08-21T16:06:12.100 回答
0

你可以试试:

GROUP BY ...
HAVING SUM(activity_weight) AND COUNT(activity_typeid)=1

仅在 HAVING 子句中用于比较的聚合函数

于 2013-08-21T16:07:30.073 回答
0

从图像看起来你想要一个支点,我相信在 MySQL 中你可以通过这样做来实现这一点

SELECT a.userid, u.name, u.profilePic,
    SUM(activity_weight) total_points,
    SUM(CASE WHEN activity_typeid=22 THEN activity_weight ELSE 0 END) activity22,
    SUM(CASE WHEN activity_typeid=33 THEN activity_weight ELSE 0 END) activity33,
    SUM(CASE WHEN activity_typeid=55 THEN activity_weight ELSE 0 END) activity55    
FROM activity_entries a 
INNER JOIN users1 u ON u.id = a.userid 
WHERE competitionId = '$competitionId' 
GROUP BY a.userid 
ORDER BY totalPoints

编辑评论:以下可能存在一些语法错误,但想法是动态创建sql然后执行它

-- generate sql for pivoted columns
SET @sql = NULL;
SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'SUM(CASE WHEN activity_typeid=',activity_typeid,
      ' THEN activity_weight ELSE 0 END) AS activity_', activity_typeid, 
    )
  ) INTO @sql
FROM activity_entries;

-- place above in full select query
-- n.b. the `$competitionId` could be a problem my MySQL is not v. good
SET @sql = CONCAT('SELECT a.userid, u.name, u.profilePic,
                          SUM(activity_weight) total_points,', @sql,
                  'FROM activity_entries 
                   JOIN users1 u ON u.id = a.userid 
                   WHERE competitionId = ''$competitionId''   
                   GROUP BY a.userid, u.name, u.profilePic
                   ORDER BY totalPoints');

-- execute the dynamic sql
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
于 2013-08-21T16:23:00.650 回答