如何在SQL中写一个IF语句来隐藏非重复行
How to write an IF statement in SQL to hide the non duplicated row
感谢您对此的关注,非常感谢。
我想要一个名为 "SHOW_or_HIDE" 的附加专栏,我可以在其中添加 Tableau.[=13= 中的过滤器功能]
下面是我的 SQL table 对于我的 Tableau 我想创建一个 IF 语句,如果相同的季度有 BOTH 输入“POR”和“CWV”,然后我想将其归类为“SHOW”,但如果它在四分之一内仅显示一个 POR 或 CWV,则“HIDE”。基本上,我只希望我的 tableau 条形图显示一个完整的季度,仅包含 POR 和 CWV,如果该季度只有 POR 或 CWV 中的一个,我想隐藏,但仍然可以选择将它们显示在Tableau.
我对 SQL 非常陌生,所以我也很难理解如何嵌套它。
当前Table
SCENARIO
TYPE
QUARTER
PROGRAM
GEO
UNITS
SHOW or HIDE
(4) FY20-Q1_POR
POR
FY20-Q1
XYZ
USA
2
HIDE
(3) FY20-Q2_CWV
CWV
FY20-Q2
XYZ
USA
1
show
(4) FY20-Q2_POR
POR
FY20-Q2
XYZ
USA
5
show
(3) FY20-Q3_CWV
CWV
FY20-Q3
XYZ
USA
3
show
(4) FY20-Q3_POR
POR
FY20-Q3
XYZ
USA
4
show
(3) FY20-Q4_CWV
CWV
FY20-Q4
XYZ
USA
9
HIDE
(3) FY21-Q1_CWV
CWV
FY21-Q1
XYZ
USA
1
show
(4) FY21-Q1_POR
POR
FY21-Q1
XYZ
USA
1
show
etc
#legacy sql
SELECT CASE WHEN TYPE ='CWV' THEN CONCAT('(3) ',QUARTER,'_',TYPE)
WHEN TYPE ='POR' THEN CONCAT('(4) ',QUARTER,'_',TYPE)
END AS SCENARIO
, CASE WHEN TYPE = 'ACTL' THEN 'ACTUALS'
WHEN TYPE = 'OTLK' THEN 'OUTLOOK'
ELSE TYPE END AS TYPE
, QUARTER
, BC.PROGRAM AS PROGRAM
, CASE WHEN GEO = 'Europe' THEN 'EUROPE'
WHEN GEO = 'India' THEN 'Pan India'
WHEN GEO = 'LATAM' THEN 'LA'
ELSE GEO END GEO
, FLOAT(SUM(CA)) AS UNITS
***, #--> ?? HERE: my guess is in this line is where I would put the coding?? AS "SHOW_or_HIDE"***
FROM [xxxxxxxxxxxxxxxxxxxxxxxxxxx.BC_REPORTS] BC
where PROGRAM = 'XYZ' #these are my temporary filters for easier viewing
and TYPE <>'ACTL' #these are my temporary filters for easier viewing
and TYPE <>'OTLK' #these are my temporary filters for easier viewing
and GEO = 'NA' #these are my temporary filters for easier viewing
and CUSTOMER = 'xyz' #these are my temporary filters for easier viewing
group by 1,2,3,4,5
order by 3,2
[![enter image description here][1]][1]
[1]: https://i.stack.imgur.com/xRotX.png
可能不是最好的解决方案。
但我们的想法是对每种类型的不同区域进行 LEFT OUTER JOIN,然后检查 NULL 值。
用 MS Access 编写,因此实际 SQL 可能略有不同(iif 函数)。
select
iif (type = 'CWV', '(3) ' + bc.quarter + '_' + type, iif(type = 'POR', '(4) ' + bc.quarter + '_' + type, null)) as scenario,
type,
bc.quarter,
program,
geo,
sum(ca) as units,
iif(cw.quarter is not null and por.quarter is not null, 'SHOW', 'HIDE') as show_or_hide
from (
bc_reports as bc
left outer join (select distinct quarter from bc_reports where type = 'CWV') cw on bc.quarter = cw.quarter
)
left outer join (select distinct quarter from bc_reports where type = 'POR') por on bc.quarter = por.quarter
group by bc.quarter, type, program, geo, cw.quarter, por.quarter
order by 3, 2
Output
感谢您对此的关注,非常感谢。
我想要一个名为 "SHOW_or_HIDE" 的附加专栏,我可以在其中添加 Tableau.[=13= 中的过滤器功能]
下面是我的 SQL table 对于我的 Tableau 我想创建一个 IF 语句,如果相同的季度有 BOTH 输入“POR”和“CWV”,然后我想将其归类为“SHOW”,但如果它在四分之一内仅显示一个 POR 或 CWV,则“HIDE”。基本上,我只希望我的 tableau 条形图显示一个完整的季度,仅包含 POR 和 CWV,如果该季度只有 POR 或 CWV 中的一个,我想隐藏,但仍然可以选择将它们显示在Tableau.
我对 SQL 非常陌生,所以我也很难理解如何嵌套它。
当前Table
SCENARIO | TYPE | QUARTER | PROGRAM | GEO | UNITS | SHOW or HIDE |
---|---|---|---|---|---|---|
(4) FY20-Q1_POR | POR | FY20-Q1 | XYZ | USA | 2 | HIDE |
(3) FY20-Q2_CWV | CWV | FY20-Q2 | XYZ | USA | 1 | show |
(4) FY20-Q2_POR | POR | FY20-Q2 | XYZ | USA | 5 | show |
(3) FY20-Q3_CWV | CWV | FY20-Q3 | XYZ | USA | 3 | show |
(4) FY20-Q3_POR | POR | FY20-Q3 | XYZ | USA | 4 | show |
(3) FY20-Q4_CWV | CWV | FY20-Q4 | XYZ | USA | 9 | HIDE |
(3) FY21-Q1_CWV | CWV | FY21-Q1 | XYZ | USA | 1 | show |
(4) FY21-Q1_POR | POR | FY21-Q1 | XYZ | USA | 1 | show |
etc |
#legacy sql
SELECT CASE WHEN TYPE ='CWV' THEN CONCAT('(3) ',QUARTER,'_',TYPE)
WHEN TYPE ='POR' THEN CONCAT('(4) ',QUARTER,'_',TYPE)
END AS SCENARIO
, CASE WHEN TYPE = 'ACTL' THEN 'ACTUALS'
WHEN TYPE = 'OTLK' THEN 'OUTLOOK'
ELSE TYPE END AS TYPE
, QUARTER
, BC.PROGRAM AS PROGRAM
, CASE WHEN GEO = 'Europe' THEN 'EUROPE'
WHEN GEO = 'India' THEN 'Pan India'
WHEN GEO = 'LATAM' THEN 'LA'
ELSE GEO END GEO
, FLOAT(SUM(CA)) AS UNITS
***, #--> ?? HERE: my guess is in this line is where I would put the coding?? AS "SHOW_or_HIDE"***
FROM [xxxxxxxxxxxxxxxxxxxxxxxxxxx.BC_REPORTS] BC
where PROGRAM = 'XYZ' #these are my temporary filters for easier viewing
and TYPE <>'ACTL' #these are my temporary filters for easier viewing
and TYPE <>'OTLK' #these are my temporary filters for easier viewing
and GEO = 'NA' #these are my temporary filters for easier viewing
and CUSTOMER = 'xyz' #these are my temporary filters for easier viewing
group by 1,2,3,4,5
order by 3,2
[![enter image description here][1]][1]
[1]: https://i.stack.imgur.com/xRotX.png
可能不是最好的解决方案。
但我们的想法是对每种类型的不同区域进行 LEFT OUTER JOIN,然后检查 NULL 值。
用 MS Access 编写,因此实际 SQL 可能略有不同(iif 函数)。
select
iif (type = 'CWV', '(3) ' + bc.quarter + '_' + type, iif(type = 'POR', '(4) ' + bc.quarter + '_' + type, null)) as scenario,
type,
bc.quarter,
program,
geo,
sum(ca) as units,
iif(cw.quarter is not null and por.quarter is not null, 'SHOW', 'HIDE') as show_or_hide
from (
bc_reports as bc
left outer join (select distinct quarter from bc_reports where type = 'CWV') cw on bc.quarter = cw.quarter
)
left outer join (select distinct quarter from bc_reports where type = 'POR') por on bc.quarter = por.quarter
group by bc.quarter, type, program, geo, cw.quarter, por.quarter
order by 3, 2
Output