使用左外部联接获取同一表计数的SQL查询
我有一个表,我需要从中获得按两列分组的计数 该表有两列,一列是使用左外部联接获取同一表计数的SQL查询,sql,join,group-by,Sql,Join,Group By,我有一个表,我需要从中获得按两列分组的计数 该表有两列,一列是datetime列,另一列是success value(-1,1,0) 我要找的是这样的东西: 每个月的成功值计数: 月----成功------计数 11------1------50 11------1------50 11---0---50 12------1------50 12------1------50 12---0---50 如果一个月没有成功值,则计数应为null或零。 我也尝试过左外部联接,但并没有用,它给出了错误的
datetime
列,另一列是success value(-1,1,0)
我要找的是这样的东西:
每个月的成功值计数:
月----成功------计数11------1------50
11------1------50
11---0---50
12------1------50
12------1------50
12---0---50
如果一个月没有成功值,则计数应为
null
或零。
我也尝试过左外部联接,但并没有用,它给出了错误的计数。您可能需要一个表,其中包含要联接的1-12之间的值,这样您就可以得到零计数。您可能需要一个表,其中包含要联接的1-12之间的值,这样您就可以得到零计数。您需要交叉联接所有的值可用月数,对照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”稍微复杂一点
@更新
对于左联接,计数(*)将始终至少返回1。从左联接的右侧开始计数(colname)才能正确。您需要根据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”稍微复杂一点
@更新
对于左联接,计数(*)将始终至少返回1。左联接右侧的计数(colname)正确。hi查询返回预期的行数,但对于特定月份,计数返回为1,其中应为零:(hi查询返回预期的行数,但对于特定月份,计数返回为1,其中应为零:(