2016-08-06 10 views
0

MySQLクエリの下に書くと、後で述べるように正しい出力が得られます。私はすでに試してみましたが失敗しましたので、あなたの提案は高く評価され、今MySQLエディタで試してみます。指定された長いmysqlクエリを延長し、完了していないカウントを取得します。

SQLフィドル:

http://sqlfiddle.com/#!9/c8dab/1

質問:

How can i get completed and not completed count by extending below query? 

問合せ:

SELECT keyworddefs.name as sprint, 
    SUM(CASE WHEN bugs.bug_status IN ('CLOSED', 'VERIFIED') 
      THEN bugs.cf1 + bugs.cf2 
      ELSE 0 END) completed, 
    SUM(bugs.cf1 + bugs.cf2) total, 
    (CASE WHEN SUM(CASE WHEN bugs.bug_status IN ('CLOSED', 'VERIFIED') 
      THEN bugs.cf1 + bugs.cf2 
      ELSE 0 END)=SUM(bugs.cf1 + bugs.cf2) 
      THEN 'Completed' 
      ELSE 'Not Completed' END) status 
FROM bugs 
JOIN keywords ON bugs.bug_id = keywords.bug_id 
JOIN keyworddefs ON keyworddefs.id = keywords.keywordid 
GROUP BY keywords.keywordid 
ORDER BY keyworddefs.name DESC; 

出力:

+--------+------------------------+--------------------+---------------+ 
| name |  completed   |  total  | status  | 
+--------+------------------------+--------------------+---------------+ 
| K2  |     14 |    14 | Completed  | 
| J2  |     16 |    24 | Not Completed | 
| J1  |     0 |    5 | Not Completed | 
+--------+------------------------+--------------------+---------------+ 
クエリを拡張した後

、ちょうど予想される出力は:イチゴが言ったように

+---------------+--------+ 
| status  | count | 
+------------------------+ 
| Completed  | 1  | 
| Not Completed | 2  | 
+------------------------+ 
+0

このクエリがエラー以外の結果になることはありません。 – Strawberry

+0

スクリーンキャスト内のクエリは、上記のクエリとは異なります。このインスタンスでは、sqlfiddleがjingよりも便利です。 – Strawberry

+0

あなたの主張は何ですか? – Strawberry

答えて

1

、それに派生テーブル名を与えます。

スキーマ:

-- bugs table1 (master table) : 

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 
(101, '2016-07-19', 3, 2, 'RESOLVED'), 
(102, '2016-07-19', 2, 1, 'VERIFIED'), 
(103, '2016-07-19', 2, 1, 'VERIFIED'), 
(103, '2016-07-19', 2, 1, 'VERIFIED'), 
(1363, '2016-07-19', 2, 1, 'VERIFIED'), 
(1352, '2016-07-19', 2, 1, 'VERIFIED'), 
(102, '2016-07-19', 2, 1, 'VERIFIED'), 
(102, '2016-07-22', 2, 2, 'CLOSED'), 
(103, '2016-07-22', 2, 2, 'CLOSED'), 
(103, '2016-07-22', 2, 2, 'CLOSED'), 
(102, '2016-07-19', 3, 2, 'NEW'), 
(102, '2016-07-19', 2, 1, 'REOPENED'), 
(102, '2016-07-19', 2, 1, 'CLOSED'), 
(102, '2016-07-19', 2, 1, 'VERIFIED'), 
(1363, '2016-07-19', 2, 1, 'VERIFIED'), 
(1352, '2016-07-19', 2, 1, 'VERIFIED'), 
(565, '2016-07-19', 2, 1, 'VERIFIED'), 
(398, '2016-07-22', 2, 2, 'CLOSED'), 
(565, '2016-07-22', 2, 2, 'CLOSED'), 
(9872, '2016-07-22', 2, 2, 'CLOSED'); 

-- keywords table2 (having keyword ids): 

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 
(101, '1'), (102, '2'), (103, '3'), (104, '4'), (105, '1'), (106, '1'), (107, '2'), (108, '3'), (109, '4'); 

-- keyworddefs table3 (having keyword names according to 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, 'K2', 'My K2 item'), (4, 'K2', 'My K2 item'); 

あなたのクエリ:

SELECT keyworddefs.name as sprint, 
     SUM(CASE WHEN bugs.bug_status IN ('CLOSED', 'VERIFIED') 
       THEN bugs.cf1 + bugs.cf2 
       ELSE 0 END) completed_story_points, 
     SUM(bugs.cf1 + bugs.cf2) total_story_points, 
     (CASE WHEN SUM(CASE WHEN bugs.bug_status IN ('CLOSED', 'VERIFIED') 
       THEN bugs.cf1 + bugs.cf2 
       ELSE 0 END)=SUM(bugs.cf1 + bugs.cf2) 
       THEN 'Completed' 
       ELSE 'Not Completed' END) sprint_status 
    FROM bugs 
    JOIN keywords ON bugs.bug_id = keywords.bug_id 
    JOIN keyworddefs ON keyworddefs.id = keywords.keywordid 
GROUP BY keywords.keywordid 
ORDER BY keyworddefs.name DESC; 

あなたの出力:

+--------+------------------------+--------------------+---------------+ 
| sprint | completed_story_points | total_story_points | sprint_status | 
+--------+------------------------+--------------------+---------------+ 
| K2  |      14 |     14 | Completed  | 
| J2  |      16 |     24 | Not Completed | 
| J1  |      0 |     5 | Not Completed | 
+--------+------------------------+--------------------+---------------+ 

募集:

+---------------+--------+ 
| status  | count | 
+------------------------+ 
| Completed  | 1  | 
| Not Completed | 2  | 
+------------------------+ 

レイジーアプローチ(あまり考えず、意味する):

SELECT sprint_status,count(*) AS count 
FROM 
( 
SELECT keyworddefs.name as sprint, 
     SUM(CASE WHEN bugs.bug_status IN ('CLOSED', 'VERIFIED') 
       THEN bugs.cf1 + bugs.cf2 
       ELSE 0 END) completed_story_points, 
     SUM(bugs.cf1 + bugs.cf2) total_story_points, 
     (CASE WHEN SUM(CASE WHEN bugs.bug_status IN ('CLOSED', 'VERIFIED') 
       THEN bugs.cf1 + bugs.cf2 
       ELSE 0 END)=SUM(bugs.cf1 + bugs.cf2) 
       THEN 'Completed' 
       ELSE 'Not Completed' END) sprint_status 
    FROM bugs 
    JOIN keywords ON bugs.bug_id = keywords.bug_id 
    JOIN keyworddefs ON keyworddefs.id = keywords.keywordid 
GROUP BY keywords.keywordid 
) xDerived 
GROUP BY sprint_status 
ORDER BY sprint_status; 

出力:すべての派生テーブルには名前が必要ですどんな

によって

+---------------+-------+ 
| sprint_status | count | 
+---------------+-------+ 
| Completed  |  1 | 
| Not Completed |  2 | 
+---------------+-------+ 

注文。上記のラップされたチャンクは1つです。 xDerivedという名前を選びました。その後も名前では使用されていません(ただし、それは可能性があります)。しかし、それでも名前が必要な場合や、エラーが発生する場合があります。

+0

言われたように、私は少し怠け者でした。 'ORDER BY keyworddefs.name DESC'の行は、ラッパーの内部では必要ありません – Drew

関連する問題