如何显示每个类别mysql子查询的数据计数

时间:2016-06-22 16:02:50

标签: mysql

我有像贝娄一样的表

tbl=province

id_province | province
----------------------
01      Province1
02      Province2
03      Province3
...
...

tbl=grade
id_grade | grade
-----------------
A      elementary       
B      junior
C      senior

tbl.transaction
-----------------------------
code    | id_province   | id_grade
--------------------------------
t1          01             A
t2          01             A
t3          01             A
t4          02             A
t5          03             C
t6          02             B
t7          03             A

我如何查询是否要显示像bellow

这样的数据
id_province | province  | count of grade A  | count of grade B | count of grade C
---------------------------------------------------------------------------------------------
01             Province1        3                    0              0
02             Province2        1                    1              0
03             Province3        1                    0              1   

我尝试使用像bellow这样的子查询进行查询,但它不起作用:

select id_province,(select count(*) from transaction where id_grade='A') as count of grade A,(select count(*) from transaction where id_grade='B') as count of grade B,
    (select count(*) from transaction where id_grade='C') as count of grade C group by id_province

此外,上面的查询显示数据如下:(

id_province | province  | count of grade A  | count of grade B | count of grade C
---------------------------------------------------------------------------------------------
01             Province1        3                    0              0
02             Province2        3                    0              0
03             Province3        3                    0              0 

知道如何解决这个问题吗?

3 个答案:

答案 0 :(得分:0)

如果您查询"省"我认为您不需要分组。表。 尝试这样的事情:

select p.id_province, p.province,
(select count(*) from transaction t1 where t1.id_grade='A' AND t1.id_province = p.id_province) as 'count of grade A',
(select count(*) from transaction t2 where t2.id_grade='B' AND t2.id_province = p.id_province) as 'count of grade B',
(select count(*) from transaction t3 where t3.id_grade='C' AND t3.id_province = p.id_province) as 'count of grade C'
FROM province p

(sql未经过测试......可能有一些错别字)

答案 1 :(得分:0)

我在SQL Server中这样做了。请注意,transaction是保留字。

select t.id_province,p.province,
       (select count(*) from [transaction] where id_grade='A' and id_province = t.id_province) as 'count of grade A',
       (select count(*) from [transaction] where id_grade='B' and id_province = t.id_province) as 'count of grade B',
       (select count(*) from [transaction] where id_grade='C' and id_province = t.id_province) as 'count of grade C'
from [transaction] t 
inner join province p on
    p.id_province = t.id_province
group by t.id_province, p.province

答案 2 :(得分:0)

您可以使用case

执行此操作
select
p.id_province,
p.province,
count(case when t.id_grade = 'A' then 1 else null end) as 'count of grade A',
count(case when t.id_grade = 'B' then 1 else null end) as 'count of grade B',
count(case when t.id_grade = 'C' then 1 else null end) as 'count of grade C'
from
province p,
transation t
where
p.id_province = t.id_province
group by p.id_province