2016-07-29 56 views
1

我想按关键字名称进行分组,获得cf1 + cf2的总和(其中bug_status = CLOSED或RESOLVED)并获得总和(不考虑错误状态)。输出将有3列像上面提到的。通过X参数得到特定条件的两列总数和另一个总数作为全参数组

尝试查询,但没有运气:

SELECT keyworddefs.name as keyword, IFNULL(SUM(bugs.cf1 + bugs.cf2),0) as completed, (SELECT IFNULL(SUM(bugs.cf1 + bugs.cf2) ,0) FROM bugs, keywords, keyworddefs WHERE (keywords.bug_id = bugs .bug_id) AND (keyworddefs.id=keywords.keywordid) AND (keyworddefs.name LIKE 'K%')) as total FROM bugs, keywords, keyworddefs WHERE (keywords.bug_id = bugs .bug_id) AND (keyworddefs.id=keywords.keywordid) AND (bugs.bug_status = 'VERIFIED' OR bugs.bug_status = 'CLOSED') GROUP BY keyworddefs.name DESC; 

这里的格式化的查询。

SELECT keyworddefs.name as keyword, 
     IFNULL(SUM(bugs.cf1 + bugs.cf2),0) as completed, 
     (SELECT IFNULL(SUM(bugs.cf1 + bugs.cf2) ,0) 
      FROM bugs, keywords, keyworddefs 
     WHERE (keywords.bug_id = bugs .bug_id) 
      AND (keyworddefs.id=keywords.keywordid) 
      AND (keyworddefs.name LIKE 'K%')) as total 
    FROM bugs, keywords, keyworddefs 
WHERE (keywords.bug_id = bugs .bug_id) 
    AND (keyworddefs.id=keywords.keywordid) 
    AND (bugs.bug_status = 'VERIFIED' OR bugs.bug_status = 'CLOSED') 
GROUP BY keyworddefs.name DESC; 

SQL小提琴:

http://sqlfiddle.com/#!9/a11b4/7

预期:

Matching records: 
cf1+cf2 bugid, keyword  bug_status 
5   (102, 'K1')  CLOSED 
3   (565, 'K2')  CLOSED 
3   (1352, 'K1')  VERIFIED 
4   (13634, 'K1')  NEW 

# Query output should be: 
keyword  completed total 
K1   8   12 
K2   3   3   

的DDL:

错误表1(主表):

CREATE TABLE `bugs` (
    `bug_id` int(11) NOT NULL, 
    `bug_date` date NOT NULL, 
    `cf1` int(11) NOT NULL, 
    `cf2` int(11) NOT NULL, 
    `bug_status` varchar(200) NOT NULL) 
ENGINE=InnoDB DEFAULT CHARSET=latin1; 

INSERT INTO `bugs` (`bug_id`, `bug_date`, `cf1`, `cf2`, `bug_status`) VALUES 
    (102, '2016-07-19', 2, 1, 'CLOSED'), 
    (72123, '2016-07-19', 2, 1, 'VERIFIED'), 
    (57234, '2016-07-19', 2, 1, 'VERIFIED'), 
    (1352, '2016-07-19', 2, 1, 'VERIFIED'), 
    (565, '2016-07-19', 2, 1, 'CLOSED'), 
    (13634, '2016-07-22', 2, 2, 'NEW'); 
(有关键词ID)和

关键字表2:

CREATE TABLE `keywords` (
    `bug_id` int(11) NOT NULL, 
    `keywordid` varchar(11) NOT NULL) 
    ENGINE=InnoDB DEFAULT CHARSET=latin1; 

INSERT INTO `keywords` (`bug_id`, `keywordid`) VALUES 
    (102, '3'), 
    (565, '4'), 
    (398, '1'), 
    (565, '2'), 
    (1352, '1'), 
    (57234, '2'), 
    (1363, '1'), 
    (72123, '2'), 
    (13634, '3'); 

keyworddefs表3(根据keywordid有关键字名):

CREATE TABLE `keyworddefs` (
    `id` int(11) NOT NULL, 
    `name` varchar(200) NOT NULL, 
    `description` varchar(200) NOT NULL) 
ENGINE=InnoDB DEFAULT CHARSET=latin1; 

INSERT INTO `keyworddefs` (`id`, `name`, `description`) VALUES 
    (1, 'J1', 'My J1 item'), 
    (2, 'J2', 'My J2 item'), 
    (3, 'K1', 'My K1 item'), 
    (4, 'K2', 'My K2 item'); 

请让我知道如果有什么在复制和格式方面出了问题样本数据。

有人可以帮助我得到预期的输出吗?

+1

对于查看您的代码和查看您的查询而非将其转储为单行的人有帮助。 –

+0

对,谢谢Ollie!下次会保重,抱歉是大邮件所以错过了! –

回答

1

它看起来像我这样做太复杂了。

首先,你应该加入你的keywordskeyworddefsON keywords.keywordid = keyworddefs.name。您正在使用keyworddefs.id。这是一个数字。所以,你早年九十年代的逗号加入收益率没有结果。

另一件事,你不需要加入keyworddefs表来得到你的结果。

SUM()操作很少会产生NULL结果。所以,你应该把你的条件放在SUM()的括号内,而不是在外面。

最后,您需要一个GROUP BY操作,其中有两个SUM()聚合。一个应该以bug_status为条件,另一个不应该。

http://sqlfiddle.com/#!9/a11b4/11/0

这样的事情应该工作。

SELECT keywords.keywordid, 
     SUM(CASE WHEN bugs.bug_status IN ('CLOSED', 'RESOLVED') 
       THEN bugs.cf1 + bugs.cf2 
       ELSE 0 END)         completed, 
     SUM(bugs.cf1 + bugs.cf2)        total 
    FROM bugs 
    JOIN keywords ON bugs.bug_id = keywords.bug_id 
GROUP BY keywords.keywordid 
ORDER BY keywords.keywordid 

如果需要通过keywords.keywordid LIKE 'K%'筛选结果,你可以添加一个where子句。

+0

非常感谢你Ollie!您的答案非常有用,但在复制数据时我犯了一个错误。关键字不包含关键字的直接名称,但不包含keyworddefs的id。更新关键字表,你能帮我相应吗?更新你的小提琴。 –

0

从奥利的评论扩展查询,它适用于两个变化。

高度赞赏Ollie!

SELECT keyworddefs.name, 
SUM(CASE WHEN bugs.bug_status IN ('CLOSED', 'VERIFIED') THEN bugs.cf1 + bugs.cf2 ELSE 0 END) completed, 
SUM(bugs.cf1 + bugs.cf2) total 
FROM bugs 
JOIN keywords ON bugs.bug_id = keywords.bug_id 
JOIN keyworddefs ON keyworddefs.id = keywords.keywordid 
WHERE keyworddefs.name LIKE 'K%' 
GROUP BY keywords.keywordid 
ORDER BY keyworddefs.name DESC; 
相关问题