在 SQL case 语句中使用相同的列值两次

问题描述 投票:0回答:1

我加入了多个视图,以获得每个部门完成任务所需时间的以下输出。输出如下所示:

ID     PROCESS  DEPT    SECONDS
------------------------------
S911    BATCH   SALES   24268
S911    BATCH   MKTG     2992
S911    BATCH   HR         77
S911    BATCH   FIN     14995
S911    BATCH   DATA      739
S911    BATCH   ITA      8988

我需要的输出是这样的:

ID     PROCESS  DEPT_2     SECONDS
----------------------------------
S911    BATCH   NONEXEMPT   24345
S911    BATCH   EXEMPT      48990
S911    BATCH   OTHERS       2992

这是否可以通过案例陈述来完成,其中豁免是销售总和,人力资源非豁免是财务、销售数据和 ITA 的总和,如果有任何其他部门,则需要将其汇总为其他部门。

注意:当我不在两个案例陈述中使用销售时,它工作得很好,当我这样做时,它失败了

case 
    when DEPT in ('SALES', 'HR') then 'NON_EXEMPT'
    when DEPT in ('FINANCE, 'SALES', 'DATA, 'ITA') then 'EXEMPT'
    else 'OTHERS'
end
sql snowflake-cloud-data-platform case
1个回答
0
投票
WITH data(ID, PROCESS, DEPT, SECONDS) as (
    select * from values
        ('S911', 'BATCH', 'SALES', 24268),
        ('S911', 'BATCH', 'MKTG',  2992),
        ('S911', 'BATCH', 'HR',    77),
        ('S911', 'BATCH', 'FIN', 14995),
        ('S911', 'BATCH', 'DATA',   739),
        ('S911', 'BATCH', 'ITA',  8988)
)
select *,
    case 
        when DEPT in ('SALES', 'HR') then 'NON_EXEMPT'
        when DEPT in ('FINANCE, 'SALES', 'DATA, 'ITA') then 'EXEMPT'
        else 'OTHERS'
    end
from data 

给出:

语法错误:意外的“SALES”。 (第 13 行)

第 13 行语法错误,位置 53 处出现意外的“)”。 (第 13 行)

好吧,让我们删除“糟糕”的销售:

select *,
    case 
        when DEPT in ('SALES', 'HR') then 'NON_EXEMPT'
        when DEPT in ('FINANCE, 'DATA, 'ITA') then 'EXEMPT'
        else 'OTHERS'
    end
from data 

语法错误:意外的“数据”。 (第 14 行)

第 14 行语法错误,位置 37 处出现意外的“,”。

第 14 行语法错误,位置 44 处出现意外的“)”。 (第 14 行)

啊,财务和数据中缺少最后的报价

select *,
    case 
        when DEPT in ('SALES', 'HR') then 'NON_EXEMPT'
        when DEPT in ('FINANCE', 'DATA', 'ITA') then 'EXEMPT'
        else 'OTHERS'
    end
from data 

所以回到原来的行并进行更正:

select *,
    case 
        when DEPT in ('SALES', 'HR') then 'NON_EXEMPT'
        when DEPT in ('FINANCE', 'SALES', 'DATA', 'ITA') then 'EXEMPT'
        else 'OTHERS'
    end
from data 

给出:

所以它按照我的预期工作。你真正想要的似乎是得到三组结果。

select
WITH data(ID, PROCESS, DEPT, SECONDS) as (
    select * from values
        ('S911', 'BATCH', 'SALES', 24268),
        ('S911', 'BATCH', 'MKTG',  2992),
        ('S911', 'BATCH', 'HR',    77),
        ('S911', 'BATCH', 'FIN', 14995),
        ('S911', 'BATCH', 'DATA',   739),
        ('S911', 'BATCH', 'ITA',  8988)
)
select
    id,
    process,
    'NONEXEMPT' as dept_2,
    sum(seconds) as seconds
from data 
where DEPT in ('SALES', 'HR')
group by 1,2

union all

select
    id,
    process,
    'EXEMPT' as dept_2,
    sum(seconds) as seconds
from data 
where DEPT in ('FIN', 'SALES', 'DATA', 'ITA')
group by 1,2


union all

select
    id,
    process,
    'OTHERS' as dept_2,
    sum(seconds) as seconds
from data 
where DEPT not in ('FIN', 'SALES', 'DATA', 'ITA', 'HR')
group by 1,2

一旦我们注意到输入使用

'FIN'
但案例使用
'FINACE'
并使它们相同,我们得到:

© www.soinside.com 2019 - 2024. All rights reserved.