问题描述
感谢您对此进行调查。
我如何在 Bigquery sql 中编写 IF 语句,总结一下单元数(如果 QUARTER 列具有相同的季度,则选择带有 TYPE ACTL、OTLK、ETC 的单元数)。 TYPE CWV 是历史数据,所以可以有重复的季度,但如果有 TYPE ACTL、OTLK 等的单位与 CWV 中的季度相同,那么我希望 sql 选择带有 TYPE ACTL、OTLK 等的单位而不是 CWV。
注意:此 sql 将用于 Tableau,我的 XYZ 单位总数应为 977071(不包括 CWV / FY20-Q4 / 104955)
行 | TMC_BC | TYPE | 程序 | 四分之一 | UNITS |
---|---|---|---|---|---|
1 | TMC | ACTL | XYZ | FY20-Q2 | 0 |
2 | TMC | OTLK | XYZ | FY20-Q3 | 6500 |
3 | TMC | CWV | XYZ | FY20-Q4 | 104955 |
4 | TMC | ACTL | XYZ | FY20-Q4 | 191300 |
5 | TMC | CWV | XYZ | FY21-Q1 | 182448 |
6 | TMC_BC | CWV | XYZ | FY21-Q2 | 91346 |
7 | TMC | CWV | XYZ | FY21-Q2 | 158126 |
8 | TMC_BC | CWV | XYZ | FY21-Q1 | 62500 |
9 | TMC | CWV | XYZ | FY21-Q1 | 157287 |
10 | TMC_BC | CWV | XYZ | FY21-Q1 | 62500 |
11 | TMC | CWV | XYZ | FY21-Q1 | 31410 |
12 | TMC_BC | CWV | XYZ | FY21-Q1 | 33654 |
我当前的 sql:
SELECT
case when tmc <= 0 then 'TMC_BC'
else 'TMC'
end as TMC_BC,TYPE,PROGRAM,QUARTER,sum(ca) as UNITS,from xx_REPORTS
where PROGRAM like 'XYZ'
and TYPE <> 'PDP' and TYPE <> 'POR'
and GEO = 'NA'
group by 1,2,3,4
order by 4 asc
解决方法
嗯。 . .如果我理解正确,您只需要 'CWV'
时没有其他类型的季度/程序/tmc_bc 组合。您可以使用窗口函数进行此过滤:
select r.*
from (select r.*,count(*) over (partition by quarter,program,tmc_bc) as q_cnt,countif(type = 'CWV') over (partition by quarter,tmc_bc) as q_cnt_cwv
from xx_REPORTS r
) r
where (q_cnt = q_cnt_cwv) or (type <> 'CWV');
实际上,如果逻辑正确,那么您想要的是非CMV行(如果有),否则所有行。一个更简单的表达是:
select r.*
from (select r.*,countif(type <> 'CWV') over (partition by quarter,tmc_bc) as q_cnt_noncwv
from xx_REPORTS r
) r
where (q_cnt_noncwv > 0 and type <> 'CWV') or q.cnt_noncwv = 0;