在SQL中只有一列为真时,如何查找计数?
我有一张桌子 类别1 类别2 平面图 计划 普朗克 2020-12-10 假的 1. 0 1. 2020-12-10 真的 1. 0 0 2020-12-11 假的 0 1. 0 2020-12-11 真的 1. 1. 0 您可以使用:在SQL中只有一列为真时,如何查找计数?,sql,Sql,我有一张桌子 类别1 类别2 平面图 计划 普朗克 2020-12-10 假的 1. 0 1. 2020-12-10 真的 1. 0 0 2020-12-11 假的 0 1. 0 2020-12-11 真的 1. 1. 0 您可以使用: 选择COUNT(*)作为cnt 从你的桌子上 其中,planA=1,planB=0,planC=0; 这可能与不使用动态SQL就可以在这里获得的模式一样好。拥有数百个计划列可能表明表设计不佳,而且这些计划列可能真的应该作为具有多条记录的单个列存在 大多数SQL
选择COUNT(*)作为cnt
从你的桌子上
其中,planA=1,planB=0,planC=0;
这可能与不使用动态SQL就可以在这里获得的模式一样好。拥有数百个计划列可能表明表设计不佳,而且这些计划列可能真的应该作为具有多条记录的单个列存在
大多数SQL函数和操作都是基于集合的,集合被定义为多个记录或行。因此,很少有SQL函数会跨任意列进行聚合(
最大值
和最小值
,在某些数据库中,可能是例外,但即使在这些数据库中,也必须列出所有列)。如果有100列具有类似标志,则数据模型存在问题
对于您的特定数据,您需要一个大的WHERE
子句:
select count(*)
from t
where a = 1 and b = 0 and c = 0 and . . . ;
也就是说,您应该有一个表,其中每个计划一行可用:
category1 category2 plan
2020-12-10 false A
2020-12-10 false C
2020-12-10 true A
. . .
只有在场的人才会在这张桌子上
然后你可以做:
select category1, category2
from t
group by category1, category2
having count(*) = 1 and min(plan) = 'A';
我认为对于planB和planC的SQL查询,条件是必须的。也许您可以应用如下计算检查:
SELECT COUNT(*) FROM my_table WHERE planA = 1 AND (planB + planC) <> 0;
从my_表中选择COUNT(*),其中planA=1和(planB+planC)0;
在我看来,您可以在SQL中使用PIVOT将行更改为列,您的输出如下所示
类别1类别2名称轴2020-12-10假平面图1 2020-12-10假计划B 0 2020-12-10假计划1 2020-12-10真实计划1 2020年12月10日真实计划B 0 2020年12月10日真实计划0 ...... .... ...
后数据透视您可以应用group by,然后使数据透视字段的总和等于1,而其他条件字段“name”=1用您正在使用的数据库标记您的问题。我认为只有在计划相互排斥的情况下,才可以使用包含计划单列的表。我的朋友不是这样的tables@Naseef . . . “相互排斥”是什么意思?这只是一行中作为标志的相同数据的替代表示形式。同一行可以有多个计划,如第1行和第4行所示Lintoff@Naseef . . . 这是由这个答案中表格的前两行表示的。