2016-01-19 36 views
0

我一直在尝试不同的组合,但我似乎无法得到这个工作。我有内部连接表,我想统计在记录中发现的QA ISSUE的数量,并且只输出QA ISSUE的那些记录,我该怎么做?count子句输出数据库中的所有记录 - mysql

SELECT d.department, m.mo_number, m.part_number, c.category, 
COUNT(CASE WHEN c.category = 'QA ISSUE' THEN category END) as qa_issue, 
SUM(CASE WHEN c.category = 'QA ISSUE' THEN time_spent END) as time_spent 
FROM  master as m 
INNER JOIN category as c ON c.cat_id = m.cat_id 
INNER JOIN department as d ON d.dept_id = m.dept_id 
WHERE m.date_created >= DATE_SUB(now(), INTERVAL 50 DAY) AND 
d.department = 'Electronics' 
GROUP BY m.mo_number 
ORDER BY 1 
+0

您是否可以提供一些示例源数据,预期输出以及运行查询时获得的输出结果? – Shadow

+0

为什么不把'c.category ='QA ISSUE''放在'WHERE'而不是'COUNT'和'SUM'? –

+0

我想统计每个部门的所有QA ISSUE记录以及所有QA ISSUE值的总和,作为time_spent。 – Brume007

回答

0

要按聚合筛选结果,请使用GROUP BY子句后面出现的HAVING子句。请注意,这不是WHERE子句(它选择要聚合的行)的替代品。

SELECT 
     d.department 
    , m.mo_number 
    , m.part_number 
    , c.category 
    , COUNT(*) AS qa_issue 
    , SUM(time_spent) AS time_spent 
FROM master AS m 
     INNER JOIN category AS c ON c.cat_id = m.cat_id 
     INNER JOIN department AS d ON d.dept_id = m.dept_id 
WHERE m.date_created >= DATE_SUB(now(), INTERVAL 50 DAY) 
     AND d.department = 'Electronics' 
     AND c.category = 'QA ISSUE' 
GROUP BY 
     d.department 
    , m.mo_number 
    , m.part_number 
    , c.category 

HAVING COUNT(*) = 1 

ORDER BY 
     d.department 

我还增加了一个条件,where子句,并添加所有的非聚集列到GROUP BY子句 - 我建议你总是这样。

+0

谢谢您的回复。如果我不清楚我的问题,我的道歉。你的查询在某种程度上起作用,即它取得2条记录,但总和应该是记录1 +记录2(sum(time_spent)= record1 + record2)的总和,其值在time_spent列中。结果集只是一个列表而不是2个值的总和当我刚刚得到2条记录的列表时,Count应该给我2的值,那是我最初得到的结果,我不知道如何去做这件事 – Brume007

+0

用DATA做它。不要尝试用文字描述需求,使用**示例**并将其添加到您的问题中,以便于阅读。阅读前面提供的URL,如果您的问题已做好准备,您将获得更快的解决方案。 –

相关问题