如何对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
当我使用 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