PL/SQL:需要帮助根据条件创建计算列。在 select 查询中完成

PL/SQL: Need help creating calculated columns based on conditions. to be done in select query

我正在尝试根据条件计算所有不同的 ID。但是我无法弄清楚语法哪里出了问题。逻辑是

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 条件为我提供每个数字。例如,如果我想要计算 column_name1 = 1 的不同 pageid,我会这样写

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

但问题是我在查询中还有其他计算列,它们都需要属于同一行。为了说明这里是 table 的样子

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

其中 calculated_column3 是 781/811 的结果。因此我不能对每一列进行新查询。我认为在计算列时使用 if 条件可以解决这个问题,但我无法以某种方式获得正确的语法。

因此,我需要知道如何在 select 查询中创建条件计算列。如果我没有很好地解释这一点,请告诉我,我会尝试进一步澄清。

您可以在 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%