使用左外连接在同一个表上计数的SQL查询

时间:2011-01-16 23:07:27

标签: sql join group-by

我有一张表,我需要将这些计数分组到两列。

该表有两列,一列datetime列,另一列是成功值(-1,1,0) 我正在寻找的是这样的:

每个月的成功价值计数:

月份----成功-----计数
11 ------- -1 ------- 50

11 ------- 1 --------- 50

11 ------- 0 ------- 50

12 ------- -1 ------- 50

12 ------- 1 ------- 50

12 ------- 0 ------- 50

如果一个月没有成功值,则计数应为null或零。 我也尝试过使用左外连接,但没有用,它会错误地计算。

2 个答案:

答案 0 :(得分:1)

您需要交叉加入所有可用月份,并根据3个成功值构建虚拟矩阵,然后可以将其连接到实际数据

select m.month, s.success, COUNT(t.month)
from (select distinct MONTH from tbl) m
cross join (select -1 success union all select 1 union all select 0) s
left join tbl t on t.month = m.month and t.success = s.success
group by m.month, s.success

如果您还需要错过几个月,可以通过更改上面的子查询“m”来稍微复杂一点。

@updated 对于左连接,Count(*)将始终返回至少1。从左连接的右边部分开始计数(colname)是正确的。

答案 1 :(得分:0)

您可能需要一张仅包含1-12值的表格,以便您可以获得零点数。