从所选记录中提取汇总作为值的划分

Extracting summary from selected records as a division of values

提问人:code_beginner 提问时间:9/8/2023 最后编辑:lemoncode_beginner 更新时间:9/8/2023 访问量:28

问:

输入表如下所示:

地区 编号 价值
2021 亚洲 01 15
2021 欧洲 02 35
2021 亚洲 03 45
2022 欧洲 04 49

我按年份、地区和 ID 选择条目:

SELECT year,
       region,
       id,
       value
FROM my_table
WHERE region = 'Asia'
  AND year = 2021
  AND (id = 01 OR id = 03)

结果是:

地区 编号 价值
2021 亚洲 01 15
2021 亚洲 03 45

然后,我需要将 ID 为 03 (45) 的字符串中的值除以 ID 为 01 (15) 的字符串中的值,并在所选字符串下得到结果 (3),如下所示:

地区 编号 价值
2021 亚洲 01 15
2021 亚洲 03 45
2021 结果 3

这是我尝试过的:

SELECT year,
    region,
    (id = 03 / id = 01),
    value
FROM my_table
WHERE region = 'Asia'
    AND year = 2021
    AND (id = 01 OR id = 03)

但它不起作用。

在SQLite中是否可能,请求应该是什么?

sql sqlite 选择 除法

评论

0赞 Umut TEKİN 9/8/2023
筛选的年份和地区是否只有 2 条记录,或者可以有多个 ID?如果是,你们的计算策略是什么?
0赞 code_beginner 9/8/2023
是的,大多数情况下只有 2 条记录。有时,结果会额外除以 12 以计算每月平均值
0赞 lemon 9/8/2023
当有超过 2 条记录和多个分区时,您可以更新您的帖子吗?
0赞 code_beginner 9/8/2023
相反,我宁愿说我需要执行一系列 2 记录划分(如 id2/id1、id5/id4 等),但在这种情况下,整个方法似乎应该有所不同

答:

1赞 lemon 9/8/2023 #1

一个想法可能是在子查询中使用窗口函数,以选择使用子查询筛选的第一个和最后一个值。选择值后,将一个值除以另一个值。然后用于收集子查询和摘要记录的结果。UNION ALL

WITH cte AS (
    SELECT Year_,
           Region,
           ID,
           Value
    FROM my_table
    WHERE Region = 'Asia'
      AND Year_ = 2021
      AND ID IN (01, 03)
)
SELECT * FROM cte
UNION ALL
SELECT DISTINCT 2021, 'Result', NULL, 
                1.0* FIRST_VALUE(Value) OVER(ORDER BY ID DESC) /
                  FIRST_VALUE(Value) OVER(ORDER BY ID)
FROM cte

输出

年_ 地区 编号 价值
2021 亚洲 1 15
2021 亚洲 3 45
2021 结果 3

在此处查看演示。

评论

0赞 code_beginner 9/8/2023
非常感谢你,效果很好!
0赞 code_beginner 9/8/2023
一个小问题:如果有 45/14 = 3.214,结果只给出 3,如何设置所需的小数位数?
1赞 lemon 9/8/2023
将其中一个值乘以“1.0”就足够了,这样SQLite就可以将其转换为浮点数并运行浮点除法。检查更新后的答案。
1赞 code_beginner 9/8/2023
再次感谢您,感谢您的帮助!