sql 嵌套查询 - 案例
sql nested queries - case
我为我的数据集创建了一个新列,
这是我的代码:
SELECT SUM("nb"), app_name, user_id, api, CASE
WHEN api='v1.pt_ob' THEN '0.7'
WHEN api='v1.place_ur' THEN '1'
WHEN api='V2' THEN '0.4'
ELSE 'autre'
END
FROM stats WHERE app_name='CMT' or app_name='CBN' GROUP BY app_name, api, user_id
现在我正在尝试添加一列,该列是其他 2 列(总和和大小写)之间相乘的结果。
所以我试着这样做:
SELECT app_name, user_id, api, sum*case
from (select SUM("nb")as sum, app_name, user_id, api, CASE
WHEN api='v1.pt_objects' THEN '0.7'
WHEN api='v1.place_uri' THEN '1'
ELSE 'autre'
END
FROM "stat_compiled"."requests_calls_y2022m02" WHERE app_name='CMI_transilien' or app_name='CMI - APM' or app_name='Media_SNCF.com' or app_name='Medias_TER' or app_name='CMI PIV- sncf.com' or app_name='CMI PIV - TER' GROUP BY app_name, api, user_id) as stat2
我遇到了错误:“错误:‘from’处或附近的语法错误”
我尝试了几件事,但找不到解决方案。有人可以帮我吗?
您需要给 CASE
表达式的结果一个别名 (给列一个名称).
此外,不要使用 SUM
(或 CASE
) 等关键字作为别名。
SELECT
app_name, user_id, api, sum_nb*case_expression
from
(
select
SUM("nb") AS sum_nb,
app_name,
user_id,
api,
CASE
WHEN api='v1.pt_objects' THEN '0.7'
WHEN api='v1.place_uri' THEN '1'
ELSE 'autre'
END
AS case_expression
FROM
"stat_compiled"."requests_calls_y2022m02"
WHERE
app_name='CMI_transilien'
OR app_name='CMI - APM'
OR app_name='Media_SNCF.com'
OR app_name='Medias_TER'
OR app_name='CMI PIV- sncf.com'
OR app_name='CMI PIV - TER'
GROUP BY
app_name, api, user_id
)
as stat2
即便如此,还是不行。
sum_nb
是数值类型
case_expression
是一个字符串
- 你不能将数字乘以字符串
- 那么,你想做什么?
旁注: 您的 OR
条件链可以简化为 IN()
表达式...
WHERE
app_name IN (
'CMI_transilien',
'CMI - APM',
'Media_SNCF.com',
'Medias_TER',
'CMI PIV- sncf.com',
'CMI PIV - TER'
)
请勿使用 'autre' 或 'other'、'not known' 或 'not applicable' 这样的结果。他们只会制造麻烦。
在关系数据库中,NULL 值正是为此而存在的。它告诉任何想阅读该专栏的人不要费心阅读,因为没有信息。就像美国信箱里的旗帜。你只有在旗帜升起时才往里看。
那么 - 为什么不将 SUM() 与 CASE 表达式相乘?
并且不要用数字引用字符串....
SELECT
app_name
, user_id
, api
, SUM(nb) * CASE api
WHEN 'v1.pt_ob' THEN 0.7
WHEN 'v1.place_uri' THEN 1
WHEN 'V2' THEN 0.4
ELSE NULL
END
FROM stat_compiled.requests_calls_y2022m02
WHERE app_name IN (
'CMI_transilien'
, 'CMI - APM'
, 'Media_SNCF.com'
, 'Medias_TER'
, 'CMI PIV- sncf.com'
, 'CMI PIV - TER'
)
GROUP BY
app_name
, api
, user_id
;
我为我的数据集创建了一个新列, 这是我的代码:
SELECT SUM("nb"), app_name, user_id, api, CASE
WHEN api='v1.pt_ob' THEN '0.7'
WHEN api='v1.place_ur' THEN '1'
WHEN api='V2' THEN '0.4'
ELSE 'autre'
END
FROM stats WHERE app_name='CMT' or app_name='CBN' GROUP BY app_name, api, user_id
现在我正在尝试添加一列,该列是其他 2 列(总和和大小写)之间相乘的结果。 所以我试着这样做:
SELECT app_name, user_id, api, sum*case
from (select SUM("nb")as sum, app_name, user_id, api, CASE
WHEN api='v1.pt_objects' THEN '0.7'
WHEN api='v1.place_uri' THEN '1'
ELSE 'autre'
END
FROM "stat_compiled"."requests_calls_y2022m02" WHERE app_name='CMI_transilien' or app_name='CMI - APM' or app_name='Media_SNCF.com' or app_name='Medias_TER' or app_name='CMI PIV- sncf.com' or app_name='CMI PIV - TER' GROUP BY app_name, api, user_id) as stat2
我遇到了错误:“错误:‘from’处或附近的语法错误” 我尝试了几件事,但找不到解决方案。有人可以帮我吗?
您需要给 CASE
表达式的结果一个别名 (给列一个名称).
此外,不要使用 SUM
(或 CASE
) 等关键字作为别名。
SELECT
app_name, user_id, api, sum_nb*case_expression
from
(
select
SUM("nb") AS sum_nb,
app_name,
user_id,
api,
CASE
WHEN api='v1.pt_objects' THEN '0.7'
WHEN api='v1.place_uri' THEN '1'
ELSE 'autre'
END
AS case_expression
FROM
"stat_compiled"."requests_calls_y2022m02"
WHERE
app_name='CMI_transilien'
OR app_name='CMI - APM'
OR app_name='Media_SNCF.com'
OR app_name='Medias_TER'
OR app_name='CMI PIV- sncf.com'
OR app_name='CMI PIV - TER'
GROUP BY
app_name, api, user_id
)
as stat2
即便如此,还是不行。
sum_nb
是数值类型case_expression
是一个字符串- 你不能将数字乘以字符串
- 那么,你想做什么?
旁注: 您的 OR
条件链可以简化为 IN()
表达式...
WHERE
app_name IN (
'CMI_transilien',
'CMI - APM',
'Media_SNCF.com',
'Medias_TER',
'CMI PIV- sncf.com',
'CMI PIV - TER'
)
请勿使用 'autre' 或 'other'、'not known' 或 'not applicable' 这样的结果。他们只会制造麻烦。 在关系数据库中,NULL 值正是为此而存在的。它告诉任何想阅读该专栏的人不要费心阅读,因为没有信息。就像美国信箱里的旗帜。你只有在旗帜升起时才往里看。
那么 - 为什么不将 SUM() 与 CASE 表达式相乘?
并且不要用数字引用字符串....
SELECT
app_name
, user_id
, api
, SUM(nb) * CASE api
WHEN 'v1.pt_ob' THEN 0.7
WHEN 'v1.place_uri' THEN 1
WHEN 'V2' THEN 0.4
ELSE NULL
END
FROM stat_compiled.requests_calls_y2022m02
WHERE app_name IN (
'CMI_transilien'
, 'CMI - APM'
, 'Media_SNCF.com'
, 'Medias_TER'
, 'CMI PIV- sncf.com'
, 'CMI PIV - TER'
)
GROUP BY
app_name
, api
, user_id
;