2016-07-29 55 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; 
相關問題