-2

我有一张桌子

类别1 类别2 计划A 计划B 计划C
2020-12-10 错误的 1 0 1
2020-12-10 真的 1 0 0
2020-12-11 错误的 0 1 0
2020-12-11 真的 1 1 0

如何找到 planA 1 和所有其他计划 0 的行数?在我的实际表中,我有 100 个计划。所以我将无法对 planA=1 和 planB=0 和 planC=0 等进行硬编码。我正在寻找一个聪明的解决方案。
我非常感谢您能提供的任何帮助。

4

4 回答 4

1

您可以使用:

SELECT COUNT(*) AS cnt
FROM yourTable
WHERE planA = 1 AND planB = 0 AND planC = 0;

这可能与您可以在不使用动态 SQL 的情况下获得的模式一样好。拥有数百个计划列可能表明表设计不佳,也许这些计划列应该作为具有多条记录的单个列真正存在。

大多数 SQL 函数和操作都是基于集合的,集合被定义为多条记录或多行。因此,很少有 SQL 函数会跨任意列进行聚合(GREATEST并且LEAST,在某些数据库中,可能是例外,但即使在那里,仍然必须列出所有列)。

于 2020-12-24T13:43:09.083 回答
0

在我看来,您可以在 SQL 中使用 PIVOT 将行更改为列,您的输出将如下所示

Category1 Category2 name Pivot
2020-12-10 false planA 1 2020-12-10 false planb 0 2020-12-10 false planc 1 2020-12-10 true planA 1 2020-12-10 true planb 0 2020-12-10 true计划 0 ………………

旋转后,您可以应用分组依据,然后使 Pivot 字段的总和等于 1,其他条件字段为“名称”= 1

于 2020-12-24T17:27:28.567 回答
0

如果您有 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';
于 2020-12-24T13:46:29.537 回答
0

我认为对于 planB 和 planC 的 SQL 查询,条件是强制性的。也许您可以应用如下计算检查:

SELECT COUNT(*) FROM my_table WHERE planA = 1 AND (planB + planC) <> 0;
于 2020-12-24T13:52:35.947 回答