2017-09-24 110 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