如何对SQL中的新CASE语句列做进一步分析?

How to do further analysis on the fresh CASE Statement column in SQL?

当我使用 CASE 语句时

示例 - In this table

我想运行下面的这个查询

SELECT 
    *,
    CASE
        WHEN productA IS NOT NULL
            THEN productA * 10
    END AS newAcolumn,
    CASE
        WHEN productB IS NOT NULL
            THEN productB * 5
    END AS newBcolumn
FROM
    table1

我想对新列执行进一步的聚合函数和计算。例子

(newAcolumn / newBcolumn) as calc

我该怎么做?我会完全创建一个新的 table 吗?

如果您想避免重复语法,您有几个选择。可能还有更多。这是我的建议。

您可以将查询结果存储在临时 table 中,然后在该临时 table 上查询。

SELECT 
  *,
  CASE  WHEN productA is not null 
  THEN 
     productA*10
  END as newAcolumn,
  CASE WHEN productB is not null 
  THEN productB*5
  END as newBcolumn
-- Look here!  Creating a temp table on the fly.
INTO 
   #tt
from table1;
-- Temp table exists now.
-- Query at will!
SELECT newBColumn / newAColumn FROM #tt;

您也可以使用 CTE,这将达到相同的目的。

WITH tt AS
(
  SELECT 
  *,
  CASE  WHEN productA is not null 
  THEN 
     productA*10
  END as newAcolumn,
  CASE WHEN productB is not null 
  THEN productB*5
  END as newBcolumn
  from 
  table1
)
-- a CTE called tt has just been created and can
-- be queried like a table
SELECT newAColumn / newBColumn FROM tt;

使用哪个取决于您的需要。如果要对变化不大的数据执行重复查询,请使用临时 table.

如果您需要绝对最新的数据并且不介意每次都按顺序进行查询,请使用 CTE。

您可以将其包装在 sub-query

SELECT *
, newAcolumn/newBcolumn AS newCcolumn
FROM
(
    SELECT *,
    CASE
    WHEN productA is not null THEN productA*10
    END as newAcolumn,
    CASE
    WHEN productB is not null THEN productB*5
    END as newBcolumn
    FROM table1
) Q;

或者使用 CTE,它类似于 sub-query 的 re-usable 模板。

WITH CTE AS (
    SELECT *,
    CASE
    WHEN productA is not null THEN productA*10
    END as newAcolumn,
    CASE
    WHEN productB is not null THEN productB*5
    END as newBcolumn
    FROM table1
)
SELECT *
, newAcolumn/newBcolumn AS newCcolumn
FROM CTE

或使用OUTER/CROSS申请

SELECT t.*
, a.newAcolumn
, a.newBcolumn
, a.newAcolumn/a.newBcolumn AS newCcolumn
FROM table1 t
OUTER APPLY (
    SELECT 
    CASE
    WHEN productA is not null THEN productA*10
    END as newAcolumn,
    CASE
    WHEN productB is not null THEN productB*5
    END as newBcolumn
) a