2017-07-17 69 views
0

我想根據條件計算所有不同的ID。但是我無法弄清楚我的語法錯在哪裏。邏輯是PL/SQL:需要幫助根據條件創建計算列。在選擇查詢中完成

COUNTD(IF ([column_name1] = 1) THEN [DATAPAGEID] END) 

這是Tableau中使用的公式。然而,當它寫在一個PL/SQL查詢爲

Select FT.NAME, COUNT(DISTINCT FT.pageID IF FT."column_name" = 1) 
as total_expected 
FROM 
(Sub Query) FT 
Group by FT.Name 
Order by FT.Name 

不用說,它的拋出錯誤。現在我可以編寫單獨的查詢,這可以使用where條件給我每個數字。例如,如果我想不同的pageid的計數,其中column_name1 = 1,我會寫這樣的事情

 Select FT.SITENAME, COUNT(DISTINCT DATAPAGEID) as Datapage 
     from 
      (sub query) 
     WHERE FT."column_name" = 1 

但是,問題是,我在查詢其他計算列,將所有需同一行的一部分。爲了說明這張表的外觀如何,

 name  Calculated_Column1 Calculated_Column2 Calculated_column3 
     abc  781     811     96.54% 
     pqr  600     800     75.00% 

其中calculated_column3是781/811的結果。因此,我無法爲每列添加新的查詢。我認爲在計算列時使用if條件會解決這個問題,但我無法以某種方式獲得語法。

因此,我需要知道如何在選擇查詢中創建條件計算列。如果我沒有解釋清楚,請告訴我,我會盡力澄清。

回答

1

如圖所示,您可以在count (DISTINCT)內使用CASE塊。

SELECT FT.NAME, 
    COUNT(DISTINCT 
    CASE 
    WHEN DATAPAGEID = 1 
    THEN 1 
    ELSE 0 
    END) Calculated_Column1, 
    COUNT(DISTINCT 
    CASE 
    WHEN DATAPAGEID = 2 
    THEN 1 
    ELSE 0 
    END) Calculated_Column2, 
    (COUNT(DISTINCT 
    CASE 
    WHEN DATAPAGEID = 1 
    THEN 1 
    ELSE 0 
    END)/COUNT(DISTINCT 
    CASE 
    WHEN DATAPAGEID = 2 
    THEN 1 
    ELSE 0 
    END)) * 100||'%' Calculated_Column3 
FROM 
    (SELECT 'abc' name, 1 DATAPAGEID FROM dual 
    UNION ALL 
    SELECT 'abc' name, 1 DATAPAGEID FROM dual 
    UNION ALL 
    SELECT 'pqr' name, 2 DATAPAGEID FROM dual 
    UNION ALL 
    SELECT 'pqr' name, 2 DATAPAGEID FROM dual 
    UNION ALL 
    SELECT 'pqr' name, 3 DATAPAGEID FROM dual 
) FT 
GROUP BY FT.Name 
ORDER BY FT.Name; 

輸出是

abc 1 1 100% 
pqr 1 2 50%