2017-09-24 108 views
-1

我试图根据另一列(SelectionIsAssetCode)推导出一列(Level5)。使用Case语句时获取空值

Selection列有两种类型的条目 - “所有资产”和“核心资产”,IsAssetCode01IsAssetCode = 0对应于“所有资产”,并且1是“核心资产”。

我在尝试分离核心和非核心资产,但我在Level5中获得了“所有资产”的额外行。

Select *, 
    Case when Selection ='All Assets' then 'Other Assets' 
     When (IsAssetCode =1 and Selection <> 'ALL ASSETS') THEN Selection 
    End as Level5 
From ((Select (columns) from tbl where IsAssetCode = 0 
     EXCEPT 
     SELECT (Columns) FROM tbl where IsAssetCode = 1) 
     Union 
     Select (column) from tbl where IsAssetCode = 1 
    ) 

输入数据:

 
B1 Black All Assets 0 
B1 White All Assets 0 
B1 Red  All Assets 0 
B1 Black Core Asset 1 

所需的输出:

 
B1 Black Core Asset 1 
B1 White Other Asset 2 
B1 Red  Other Asset 2 
+1

编辑你的问题,(1)标签与正在使用的数据库; (2)提供样本数据和期望的结果。另外,你的SQL查询在语法上不是正确的('case'上没有'end')。而'NULL'是列中的值,而不是行的状态。 –

回答

0

请始终标记的RDBMS中,我假设的SQL服务器。

当没有条件满足一个CASE EXPRESSION的默认值是NULL,所以我的猜测 - 所有以“所有资产”行有IsAssetCode <> 1吧?

要覆盖这一点,你可以使用ELSE

CASE WHEN <Cond> Then <FirstVal> 
    WHEN <Cond2> Then <SecondVal> 
    ELSE <IfNonOfAboveVal> 
END 

或者只是提供不同的条件来捕获一切。

+0

我只有这些条件。如何跳过Case语句中的特定条件? – Sanjeet

+1

我不明白这个问题。 – sagi

+0

我在表格中有四列 – Sanjeet

0

只需使用COUNT()和GROUP BY以获得所需的数

SELECT *, 
     CASE WHEN selection = 'All Assets' 
      THEN 'Other Assets' 
      WHEN (isassetcode = 1 AND selection <> 'All Assets') 
      THEN selection 
     END AS Level5, 
     COUNT(*) cnt 
    FROM table --or sub-query 
GROUP BY list all columns in the select that corresponds the *, 
      CASE WHEN selection = 'All Assets' 
       THEN 'Other Assets' 
       WHEN (isassetcode = 1 AND selection <> 'All Assets') 
       THEN selection 
      END