mysql连接查询

mysql连接查询,sql,mysql,pivot,Sql,Mysql,Pivot,我有一个以下表格的查询(简化为只显示感兴趣的列) 现在我得到的是 t3是一个独特的“时段”表 t1是唯一代码表 t2是连接二者的连接表,以及一个状态,因为这个示例status=(a,B,C) 我所做的是创建一个按“期间”分组的查询结果,并且在每个状态下都有“代码”计数 这很容易解决,但我想把它扩展到,不仅有a,B和C中的“代码”计数,还有一个与某个周期无关的代码计数,或者换句话说,在给定的周期内,不在t2中的代码计数 所以我想要的结果是 Period A B C (Code

我有一个以下表格的查询(简化为只显示感兴趣的列)

现在我得到的是

t3是一个独特的“时段”表

t1是唯一代码表

t2是连接二者的连接表,以及一个状态,因为这个示例status=(a,B,C)

我所做的是创建一个按“期间”分组的查询结果,并且在每个状态下都有“代码”计数

这很容易解决,但我想把它扩展到,不仅有a,B和C中的“代码”计数,还有一个与某个周期无关的代码计数,或者换句话说,在给定的周期内,不在t2中的代码计数

所以我想要的结果是

Period    A    B    C   (Codes from t1 not found in t2)
P1        10   5    2   3
P2        5    5    5   10

可以使用交叉联接选择所有期间的所有代码的矩阵。允许您计算不存在的行数:

select
    sum(case when t2.status is 'A' then 1 else 0 end) as ACount,
    sum(case when t2.status is 'B' then 1 else 0 end) as BCount,
    ...
    sum(case when t2.code is null then 1 else 0 end) as NotPresentCount
from       t1
cross join t3
left join  t2 
on         t2.code = t1.code and t2.period = t3.period
group by   t3.period

正是我想要的。谢谢
select
    sum(case when t2.status is 'A' then 1 else 0 end) as ACount,
    sum(case when t2.status is 'B' then 1 else 0 end) as BCount,
    ...
    sum(case when t2.code is null then 1 else 0 end) as NotPresentCount
from       t1
cross join t3
left join  t2 
on         t2.code = t1.code and t2.period = t3.period
group by   t3.period