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。