3

嗨 StackOverFlow 成员

报告 = 表名。

数据库

CREATE TABLE `reports` (
  `id` int(11) NOT NULL auto_increment,
  `report_day_name` varchar(20) NOT NULL,
  `report_day` varchar(20) NOT NULL,
  `report_month` varchar(20) NOT NULL,
  `report_year` varchar(20) NOT NULL,
  `report_result_number` varchar(20) NOT NULL,
  `report_result_text` varchar(20) NOT NULL,
  `report_since` varchar(20) NOT NULL,
  `report_date` varchar(20) NOT NULL,
  `catid` int(11) NOT NULL,
  `subjectid` int(11) NOT NULL,
  `userid` int(11) NOT NULL,
  `groupid` int(11) NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=78 ;

INSERT INTO `reports` VALUES (73, 'day', '14', '1', '1434 h', '5', 'rate', '1234567890', '1434-1-14', 1, 132, 33, 35);
INSERT INTO `reports` VALUES (74, 'day', '12', '2', '1435 h', '4', 'rate', '1234567890', '1434-2-12', 2, 136, 36, 35);
INSERT INTO `reports` VALUES (75, 'day', '14', '1', '1434 h', '2', 'rate', '1354488730', '1434-1-14', 1, 132, 33, 35);
INSERT INTO `reports` VALUES (76, 'day', '12', '2', '1435 h', '4', 'rate', '1354488730', '1434-2-12', 2, 137, 36, 35);
INSERT INTO `reports` VALUES (77, 'day', '12', '2', '1435 h', '1', 'rate', '1354488730', '1434-2-12', 2, 134, 33, 35);

这是数据库表:

id  report_result_number    subjectid   userid
73  5                       132         33
74  4                       136         36
75  2                       132         33
76  4                       137         36
77  1                       134         33

我想要SUM(reports.report_result_number) where (reports.subjectid) is DISTINCT

当我运行这段代码时..

选择
  users.user_id, users.user_name, users.user_country, SUM(reports.report_result_number) AS AllTotal, COUNT(DISTINCT reports.subjectid) AS TotalSubjects
从
  用户
  INNER JOIN 报告 users.user_id = reports.userid
通过...分组
  users.user_id
  订购方式
  全部 DESC 限制 4

它返回 AllTotal

user_id user_name   user_country    AllTotal    TotalSubjects
36       name         country        8 (correct)        2
33        name        country        8 (not correct)    2
4

1 回答 1

2

这个问题有几种解释。

如果您想要的是 result_report_number仅当给定的 subjectid 和 userid 只有一行时才包含在 SUM 聚合中的值(如果相同的 subjectid 有多行,您希望排除所有的 report_result_number那些行...

然后这样的事情会起作用:

SELECT u.user_id
     , u.user_name
     , u.user_country
     , SUM(s.report_result_number) AS AllTotal
     , COUNT(DISTINCT r.subjectid) AS TotalSubjects
  FROM users u
  JOIN reports r
    ON r.userid = u.user_id
  JOIN ( SELECT d.userid
              , d.subjectid
              , d.report_result_number
           FROM reports d
          GROUP
             BY d.userid
              , d.subjectid
         HAVING COUNT(1) = 1
       ) s
    ON s.userid = r.userid
 GROUP
    BY u.user_id
 ORDER
    BY AllTotal DESC
 LIMIT 4


这只是对请求的结果集的一种(奇怪的)解释。样本数据和预期结果集将大大有助于阐明规范。


对于您添加到问题中的数据,此查询应该返回,例如

36 fee fi   8  2 
33 foo bar  1  2 

用户 33 有两行的 subjectid 值为 132,因此这些行的 report_result_number 从 SUM 中排除。subjectid 有两个不同的值(132 和 134),因此我们返回 :distinct: count of 2。


如果您要求 SUM 仅在给定用户的 subjectid 没有重复值的情况下返回值...

SELECT u.user_id
     , u.user_name
     , u.user_country
     , IF(COUNT(DISTINCT r.subjectid) = COUNT(r.subjectid)
         ,SUM(r.report_result_number)
         ,NULL
       ) AS AllTotal
     , COUNT(DISTINCT r.subjectid) AS TotalSubjects
  FROM users u
  JOIN reports r
    ON r.userid = u.user_id
 GROUP
    BY u.user_id
 ORDER
    BY AllTotal DESC
 LIMIT 4

哈桑说......“如果有重复的值 [of subjectid for a given userid],请获取其中一个”

只需从别名为s. 这将返回一行的 report_result_number 的值。(从哪个“匹配”行返回值将是任意的:

SELECT u.user_id
     , u.user_name
     , u.user_country
     , SUM(r.report_result_number) AS AllTotal
     , COUNT(DISTINCT r.subjectid) AS TotalSubjects
  FROM users u
  JOIN ( SELECT d.userid
              , d.subjectid
              , d.report_result_number
           FROM reports d
          GROUP
             BY d.userid
              , d.subjectid
       ) r
    ON r.userid = u.user_id
 GROUP
    BY u.user_id
 ORDER
    BY AllTotal DESC
 LIMIT 4

要使结果集可重复,始终获得最低或最高值,您可以添加一个聚合函数来指定要返回的值。

代替...

          , d.report_result_number

和...

          , MAX(d.report_result_number)  AS report_result_number

使用 MAX() 聚合,这将返回:

36 fee fi   8  2
33 foo bar  6  2

(对于subjectid = 132 userid = 33,查询将获得'5'的值,并且对于相同的subjectid,将省略'2'的值。)没有MAX聚合,查询可以有效(并且任意)返回一个' 3'代替'6'。(它可以包括“5”或“2”,并省略另一个。)

SQL小提琴在这里

SQL Fiddle 包括此处的 MAX 聚合


问:我如何在您的代码中使用 (where report_month = 'number')?

A:在内联视图中,在 FROM 子句之后,GROUP BY 子句之前添加 WHERE 子句。替换这个:

       FROM reports d
      GROUP

与例如

       FROM reports d
      WHERE d.report_month = 'number'
      GROUP

只有满足指定谓词的行才会被返回。

于 2012-12-12T22:08:04.617 回答