我在使用某些sql语句时遇到麻烦。
我有一张这样的桌子:
我找不到任何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
答案 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