我有一张桌子
| 类别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 等进行硬编码。我正在寻找一个聪明的解决方案。
我非常感谢您能提供的任何帮助。
我有一张桌子
| 类别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 等进行硬编码。我正在寻找一个聪明的解决方案。
我非常感谢您能提供的任何帮助。
您可以使用:
SELECT COUNT(*) AS cnt
FROM yourTable
WHERE planA = 1 AND planB = 0 AND planC = 0;
这可能与您可以在不使用动态 SQL 的情况下获得的模式一样好。拥有数百个计划列可能表明表设计不佳,也许这些计划列应该作为具有多条记录的单个列真正存在。
大多数 SQL 函数和操作都是基于集合的,集合被定义为多条记录或多行。因此,很少有 SQL 函数会跨任意列进行聚合(GREATEST并且LEAST,在某些数据库中,可能是例外,但即使在那里,仍然必须列出所有列)。
在我看来,您可以在 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
如果您有 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;