2012-06-15 33 views
0

我正在使用MySQL查询编写报告。它有多个我报告的列。其中,有一列包含许多不同的值(只有一个值前行)。该列中有两个特定值需要计算。mysql:针对单个列计数发生特定值的行数

ID Name has passed Type 
1 abc  yes (1) z 
2 xyz  yes (1) x 
3 cde  no (0) y 
4 abc  yes (1) z 
5 cde  no (0) z 
6 xyz  no (0) y 

我预期的结果是:

For Type x 
total records = 1 
yes count = 1  
total abc = 0 
total cde = 0 

For Type y 
total records = 2 
yes count = 0  
total abc = 0 
total cde = 1 

For Type z 
total records = 3 
yes count = 2 
total abc = 2 
total cde = 1 

注意,我们不要指望名字XYZ或任何其他名称的最终结果,然后按类型分组。

回答

0
SELECT 
    type, 
    COUNT(*) AS total_records, 
    COUNT(IF(has_passed, 1, NULL)) AS yes_count, 
    COUNT(IF(name = 'abc', 1, NULL)) AS total_abc, 
    COUNT(IF(name = 'cde', 1, NULL)) AS total_cde 
FROM 
    table 
GROUP BY 
    type 
+0

PERFECTO!非常感谢,赞恩。我虽然我在来到StackOverflow之前试过这个查询。它完全如我所愿。 –

0

关闭我的头顶部(没有获得用于测试的数据库,现在,对不起)...也许像这样的工作(假设你存储0和1通过了” “)?

SELECT 
    type, 
    SUM(passed) as "Yes count", 
    SUM(case when name = 'abc' then 1 else 0 end) as "Total abc", 
    SUM(case when name = 'cde' then 1 else 0 end) as "Total cde", 
    COUNT(1) as "Total records" 
FROM 
    myTable 
GROUP BY 
    type 
; 
+0

呃...被我殴打了。我也认为我的示例可能使用Oracle语法。虽然它的要点是相同的。 –

+0

虽然解决方案的优点是'CASE'表达式在其他DBMS中更加标准,而'IF'主要是MySQL特定的。 –

+0

是的,我尽可能保持标准。在这种情况下,MySQL的版本更短,但使用'CASE'的标准方式更易于理解IMO。无论如何,要么做的工作:O) –