2016-07-29 8 views
1

キーワード名でグループ化し、cf1 + cf2(bug_status = CLOSEDまたはRESOLVED)の合計を取得し、バグの状態)。出力には上記のような3列があります。 特定の基準の2つの列の合計を取得し、もう1つの合計を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:

バグTABLE1(マスターテーブル):

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'); 

キーワード表2(キーワードのIDを持つ):

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

これはあまりにも複雑すぎるように見えます。

keywordskeyworddefsテーブルON keywords.keywordid = keyworddefs.nameに参加する必要があります。あなたはkeyworddefs.idを使用しています。それは数字です。だから、あなたの昔のコンマ参加は結果をもたらしません。

結果を得るために、keyworddefsテーブルに参加する必要はありません。

SUM()ほとんどの場合、結果はNULLとなります。だから、あなたの条件を外側ではなくSUM()のかっこの中に置くべきです。

最後に、2つのSUM()アグリゲートがあるGROUP BY操作が必要です。 1つはbug_statusで調整され、もう1つは調整すべきではありません。このような何かが動作するはず

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

ありがとうございました!あなたの答えは非常に役立ちますが、私は間違いを犯しました。キーワードはキーワードの直接の名前ではなく、キーワードのIDのIDの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; 
関連する問題