mySQL - 如何使count()函数不丢弃0计数?

时间:2017-08-03 16:47:41

标签: mysql sql-merge

我是mySQL的新手并且处理一个查询,该查询基本上需要一个初始表并在两个单独的表中汇总其内容。第二个"摘要" table正在丢弃值为0的元组;我需要解决这个问题。以下是具体细节:

我有一个大型库存表,我从其他表中汇总:

SID  CID   SECTION  RATING
==========================
100  1001  1        A
101  1001  1        A
102  1002  1        B
103  1002  2        F
104  1003  1        A
...etc...

(" CID"和#34;部分"是这里的主要关键,我不知道PK是否分布在两个属性上是很重要的。)我有成功的查询(" numTable1"),它计算每个CID和Section的SID数量。例如,使用上面的库存表," sumTable1"将是:

CID   SECTION  numSID
=====================
1001  1        2
1002  1        1
1002  2        1
1003  1        1
...etc...

这是SQL:

create temporary table numTable1(
    SELECT ot1.cid, ot2.section, count(ot1.sid) 'numSID'
    FROM otherTable1 ot1, otherTable2 ot2
    WHERE ot1.cid=ot2.cid and ot1.section=ot2.section
    GROUP BY ot1.cid, ot2.section
);

" NumTable"效果很好。这就是问题所在:我还需要一个查询来计算“A'”的数量。每个CID /部分的评级:

create temporary table numA(
    select t9.cid, t9.section, count(ot1.rating) 'As'
    from otherTable1 ot1, t9
    where grade = 'A' and t9.cid=ot1.cid and t9.section=ot1.section
    group by t9.cid, t9.section

);

这里是" numA"的输出:

CID   SECTION  As
=====================
1001  1        2
1003  1        1
...etc...

但这就是问题所在;一些CID /部门没有A评级,他们正在被淘汰。我需要的是:

CID   SECTION  As
=====================
1001  1        2
1002  1        0
1002  2        0
1003  1        1
...etc...

您需要注意的是,上表可以与" numTable1"无缝合并,这是最终目标:

CID   SECTION  numSID   As
==========================
1001  1        2        2
1002  1        1        0
1002  2        1        0
1003  1        1        1

但只要" numA"滴水CID /部分为0,我死在水中。我假设我的"组由"声明" numA"正在淘汰零......但我对此并不确定。有什么建议吗?

1 个答案:

答案 0 :(得分:0)

@NigelRen提供了解决方案 - 左连接。这是代码:

-- Left Join on numTable1 with numA... makes for total students // numAs
-- Resultant table is totA: "Total A Ratings"
create temporary table totA(
    select numTable1.cid, numTable19.section, numTable1.numStudents, if(numA.As is null, 0, numA.As) 'A Ratings'
    from numTable1
    left join numA on numTable1.cid=numA.cid and numTable1.section=numA.section
);