Hi StackOverFlow成员
reports=表名。
数据库
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)是distinct
当我运行这段代码时..
SELECT users.user_id, users.user_name, users.user_country, SUM(reports.report_result_number) AS AllTotal, COUNT(DISTINCT reports.subjectid) AS TotalSubjects FROM users INNER JOIN reports ON users.user_id = reports.userid GROUP BY users.user_id ORDER BY AllTotal DESC LIMIT 4
它返回AllTotal
user_id user_name user_country AllTotal TotalSubjects
36 name country 8 (correct) 2
33 name country 8 (not correct) 2
这个问题有两种解释。
<罢工>
如果您想要的是
result_report_number
仅当给定的subjectid和userid只有一行时才包含在和聚合中(如果同一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被排除在总和之外。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
哈桑说...“如果[给定用户ID的subjectid]有重复值,请获取其中一个值”
只需从别名为s
的内联视图中删除HAVING子句。这将返回一行的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
为了使resultset可重复,为了始终获得最低或最高值,可以添加一个聚合函数来指定返回哪个值。
替换...
, 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”,并省略另一个。)
Q:如何在代码中使用(where report_month='number')?
A:在内联视图中,在GROUP BY子句之前的FROM子句之后添加WHERE子句。替换此:
FROM reports d
GROUP
与例如。
FROM reports d
WHERE d.report_month = 'number'
GROUP
仅返回满足指定谓词的行。