SQL:GROUPBY并检查是否设置了all、some或none

SQL:GROUPBY并检查是否设置了all、some或none,sql,group-by,aggregate,Sql,Group By,Aggregate,假设我有下表: FKEY A B C D E F 'A' 1 0 1 0 1 0 'A' 0 1 1 1 0 0 现在我想通过FKEY创建一个组,但我只想知道a-F列是否在一个、所有或没有分组行中有1个。。上表的结果是: FKEY A B C D E F 'A' S S A S S N …其中S表示“部分”,A表示“全部”,N表示“无” 进行此查询的最佳方法是什么。我可以这样做一些嵌套查询,但没有更聪明的方法吗 在我的真实数据中,1和0实际上是DATETIME和NULL您可以使

假设我有下表:

FKEY A B C D E F
'A'    1 0 1 0 1 0
'A'    0 1 1 1 0 0
现在我想通过FKEY创建一个组,但我只想知道a-F列是否在一个、所有或没有分组行中有1个。。上表的结果是:

FKEY A B C D E F
'A'  S S A S S N
…其中S表示“部分”,A表示“全部”,N表示“无”

进行此查询的最佳方法是什么。我可以这样做一些嵌套查询,但没有更聪明的方法吗


在我的真实数据中,1和0实际上是DATETIME和NULL

您可以使用
大小写和聚合:

select fkey,
       (case when sum(a) = 0 then 'N'
             when sum(a) = count(*) then 'A'
             else 'S'
        end) as a,
       (case when sum(b) = 0 then 'N'
             when sum(b) = count(*) then 'A'
             else 'S'
        end) as b,
       . . .
from t
group by fkey;
以上假设值仅为
0
1
。如果是这样的话,你可以这样说:

   (case when max(a) = 0 then 'N'
         when min(a) = 1 then 'A'
         else 'S'
    end) as a,

您可以使用
case
和聚合:

select fkey,
       (case when sum(a) = 0 then 'N'
             when sum(a) = count(*) then 'A'
             else 'S'
        end) as a,
       (case when sum(b) = 0 then 'N'
             when sum(b) = count(*) then 'A'
             else 'S'
        end) as b,
       . . .
from t
group by fkey;
以上假设值仅为
0
1
。如果是这样的话,你可以这样说:

   (case when max(a) = 0 then 'N'
         when min(a) = 1 then 'A'
         else 'S'
    end) as a,

您提到您的0和1实际上是空的或非空的日期。下面是Gordon查询的一个修改版本:

select fkey,
       (case when count(datecol) = 0 then 'all dates are null'
             when count(datecol) = count(*) then 'all dates are filled'
             else 'some are null, some filled'
        end) as a,
       ...
from t
group by fkey;

COUNT(null)
为0,
COUNT('2001-01-01')
为1,
COUNT(*)
是独立于任何变量的行数。所以,若我们的日期计数为0,则所有日期都必须为空。如果日期的计数等于行的计数,则必须用某个值填充所有日期,否则这是一种混合,您提到0和1实际上是空的或非空的日期。下面是Gordon查询的一个修改版本:

select fkey,
       (case when count(datecol) = 0 then 'all dates are null'
             when count(datecol) = count(*) then 'all dates are filled'
             else 'some are null, some filled'
        end) as a,
       ...
from t
group by fkey;

COUNT(null)
为0,
COUNT('2001-01-01')
为1,
COUNT(*)
是独立于任何变量的行数。所以,若我们的日期计数为0,则所有日期都必须为空。如果日期的计数等于行的计数,则必须用某个值填充所有日期,否则这是一个混合

Yea。。我在这里的问题可能有点太模糊了,因为它实际上不是布尔值,而是日期和空值。但是我可能只需要做一个子查询,就可以将日期/空值转换为1和0。如果使用count(date)-to count(),则可能不需要将它们转换为空值,空值等于0,其他值都等于1。有效的学习点;始终张贴您的实际问题,而不是修改形式的问题it@HenrikClausen . . . 这并没有改变第一个答案。如果你有一个关于日期的问题,但这不太适用,问一个新问题。这个问题已经回答了。是的。。我在这里的问题可能有点太模糊了,因为它实际上不是布尔值,而是日期和空值。但是我可能只需要做一个子查询,就可以将日期/空值转换为1和0。如果使用count(date)-to count(),则可能不需要将它们转换为空值,空值等于0,其他值都等于1。有效的学习点;始终张贴您的实际问题,而不是修改形式的问题it@HenrikClausen . . . 这并没有改变第一个答案。如果你有一个关于日期的问题,但这不太适用,问一个新问题。这个问题已经回答了。您使用的是哪种产品?“SQL”只是一种查询语言,而不是特定数据库产品的名称。请为您正在使用的数据库产品
postgresql
oracle
sqlserver
db2
,…添加一个。只要你在谈论概念,特定的数据库就不应该是相关的。我故意省略了它,因为我应该能够将任何ansver转换为我使用的特定DB。您使用的是哪种产品?“SQL”只是一种查询语言,而不是特定数据库产品的名称。请为您正在使用的数据库产品
postgresql
oracle
sqlserver
db2
,…添加一个。只要你在谈论概念,特定的数据库就不应该是相关的。我故意省略了它,因为我应该能够将任何ansver翻译成我使用的特定DB。