2016-08-20 44 views
0

我坚持努力做计算的SQL查询。我有台出席,看起来像这样:在MySQL查询执行复杂的计算

roll | sub_id | status 
abc |  1 | 1 
abc |  1 | 0 
abc |  2 | 1 
xcv |  1 | 1 
abc |  2 | 1 
abc |  1 | 1 
lkj |  2 | 0 

这是我的表受到的例子:

id | name 
1 | Data Structure 
2 | Cloud Computing 

我想选择特定的卷不同sub_id,然后用0开始计数的状态数和状态1并链接到主题表并显示其名称。 我想要这样的东西:

roll | sub_id |  name  | status with 0 | status with 1 
abc | 1 |Data Structure |  1  |  2 
abc | 2 |Cloud Computing |  0  |  2 

有人可以解释我吗? 我该如何处理查询?

回答

0

你可以这样做:

SELECT 
    a.roll, 
    a.sub_id, 
    b.name, 
    SUM(Case when status=0 then 1 else 0 end) as 'status with 0', 
    SUM(Case when status=1 then 1 else 0 end) as 'status with 1' 
FROM 
    myTable a inner join subject b on 
    a.sub_id = b.id 
    group by a.roll, a.sub_id; 

我做了一个捣鼓你:http://sqlfiddle.com/#!9/23d1d9/11/0

+0

谢谢!好的方法。 –

+0

这种方法存在一个问题:查询选择了一个非聚合列('b.name'),它没有出现在GROUP BY子句中,并且在所有情况下都可能不会给出正确的结果。这个查询甚至不会运行在Oracle,SQL Server和MySQL以外的任何数据库中。 –

+0

我同意@TimBiegeleisen。它不会用完5.7 – Drew

3

可以使用条件聚集枢轴查询来获取你想要的输出。下面的子查询计算吻合为status当该值既01,对于每个各roll/sub_id基。

SELECT t1.roll, 
     t1.sub_id, 
     COALESCE(t2.name, 'name is NA'), 
     t1.`status with 0`, 
     t1.`status with 1` 
FROM 
(
    SELECT roll, 
      sub_id, 
      SUM(CASE WHEN status = 0 THEN 1 ELSE 0 END) AS `status with 0`, 
      SUM(CASE WHEN status = 1 THEN 1 ELSE 0 END) AS `status with 1` 
    FROM attendance 
    GROUP BY roll, 
      sub_id 
) t1 
LEFT JOIN 
subject t2 
    ON t1.sub_id = t2.id 

按照下面的运行演示的链接:

SQLFiddle

+0

它在主题t2附近给出语法错误 ( 选择的是卷筒纸 sub_id, –

+0

这看起来非常复杂的查询。没有更简单的方法吗? –

+0

@TomCruise这个查询确实不是那么复杂。 –