提问人:code_beginner 提问时间:9/8/2023 最后编辑:lemoncode_beginner 更新时间:9/8/2023 访问量:28
从所选记录中提取汇总作为值的划分
Extracting summary from selected records as a division of values
问:
输入表如下所示:
年 | 地区 | 编号 | 价值 |
---|---|---|---|
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中是否可能,请求应该是什么?
答:
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
再次感谢您,感谢您的帮助!
评论