SQL“全部”分组依据

时间:2019-12-09 09:20:49

标签: sql group-by amazon-redshift

我在使用某些sql语句时遇到麻烦。

我有一张这样的桌子:

Table

我找不到任何SQL表单来执行此操作,但是我想要这样的内容:

SELECT 
   Col1, 
   CASE WHEN all(Col2 in ('A','B','C') THEN "auto"
        ELSE distinct Col2 not in ('A','B','C')        as Col2
FROM mytable
GROUP BY Col1

很明显,查询不是有效的SQL,因此我在这里解释了我想要的内容: 如果组中的所有寄存器都是A,B或C,则我希望列值是“ AUTO”,如果有任何列值不同于A,B或C,则我希望选择该值。

所以结果必须是:

Col1   Col2
1      AUTO
2      R

4 个答案:

答案 0 :(得分:2)

您可以使用聚合:

select
    col1,
    coalesce(max(case when Col2 not in ('A', 'B', 'C') then Col2 end), 'AUTO') Col2
from mytable 
group by col1

如果给定Col2的{​​{1}}的所有值都属于Col1,则A/B/C返回max(case when Col2 not in ('A', 'B', 'C') then Col2 end),外部合并变为{{1 }}。否则,返回除null之外的最大值。

答案 1 :(得分:0)

看一下样本,您似乎只需要带有所有3个值('A','B','C')的col1,而对于其他值则不在('A','B','C' )

select  t.col1 , t.check
from  (
  select  col1, 'AUTO' check
  from mytable 
  group by  col1 
  HAVING count(distinct col2)=3 
) t
inner join  mytable m on t.col1 = m.col1 and m.col2 in ('A','B','C')
UNION 

select col1, col2 
from mytable 
where col2 not in  ('A','B','C')

答案 2 :(得分:0)

尝试此代码:

-- drop table #t ;
create table #t (col1 INT, col2 nvarchar(32));
insert into #t values (1,'A'),(1,'B'),(1,'C'),(2,'A'),(2,'B'),(2,'R')
-- select * from #t

select 
    col1,
    case 
        when SUM(case when col2 in ('A','B','C') then 1 else 0 end) = COUNT(1)
        then 'auto'
        else MAX(case when col2 in ('A','B','C') then '' else col2 end)
    end col2_groupped
from
    #t
group by
    col1

答案 3 :(得分:0)

您首先需要没有 AUTO 的案例列表,然后是不在第一个列表中的 AUTO 列表:

with datas (col1, col2) as (
  values
  (1, 'A'),
  (1, 'B'),
  (1, 'C'),
  (2, 'A'),
  (2, 'B'),
  (2, 'R')
),
not_auto as (
  select col1, col2 from datas where col2 not in ('A', 'B', 'C')
)
select col1, 'AUTO' as col2 from datas
  where col2 in ('A', 'B', 'C')
        and not exists(select 0 from not_auto where not_auto.col1 = datas.col1) group by col1
union all
select * from not_auto
order by col1, col2