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
;