首页 > 解决方案 > 如何在 SQL 中编写 IF 语句来隐藏非重复行

问题描述

感谢您对此进行调查,非常感谢。

我想要一个名为“SHOW_or_HIDE”的附加列,我可以在其中添加 Tableau 中的过滤器功能。

下面是我的 Tableau 的 SQL 表,我想根据相同的季度是否同时具有“POR”和“CWV”两种类型来创建一个 IF 语句,然后我想将其分类为“SHOW”,但如果它只显示一个 POR 或CWV 在四分之一然后“隐藏”。基本上,我只希望我的表格条形图显示仅包含 POR 和 CWV 的完整季度,如果该季度只有 POR 或 CWV 之一,我想隐藏但仍然可以选择在 Tableau 中显示它们。

我对 SQL 非常陌生,所以我也很难嵌套它。

当前表

设想 类型 四分之一 程序 地球仪 单位 显示或隐藏
(4) FY20-Q1_POR 上门 FY20-Q1 XYZ 美国 2 隐藏
(3) FY20-Q2_CWV CWV FY20-Q2 XYZ 美国 1 节目
(4) FY20-Q2_POR 上门 FY20-Q2 XYZ 美国 5 节目
(3) FY20-Q3_CWV CWV FY20-Q3 XYZ 美国 3 节目
(4) FY20-Q3_POR 上门 FY20-Q3 XYZ 美国 4 节目
(3) FY20-Q4_CWV CWV FY20-Q4 XYZ 美国 9 隐藏
(3) FY21-Q1_CWV CWV FY21-Q1 XYZ 美国 1 节目
(4) FY21-Q1_POR 上门 FY21-Q1 XYZ 美国 1 节目
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

标签: sqltableau-api

解决方案


可能不是最好的解决方案。

但想法是在每种类型的不同季度上使用 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

输出


推荐阅读