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%
我正在尝试根据条件计算所有不同的 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%