sql - 按列值查询某些行的联合和分组
问题描述
我有一张名为 Products 的表。我正在尝试编写一个查询来根据and对total_amt
and的值求和。total_num
year
product_code
total_amt_by_prod
并且total_num_by_prod
是预期的输出。
年 | 产品代码 | amt1 | amt2 | amt3 | total_amt | total_amt_by_prod | 数字1 | num2 | num3 | 总数 | total_num_by_prod |
---|---|---|---|---|---|---|---|---|---|---|---|
2020 | LA2013288 | 10000 | 无效的 | 无效的 | 10000 | 10000 | 4 | 1 | 3 | 8 | 8 |
2021 | XS2014184 | 无效的 | 无效的 | 103330531 | 103330531 | 291396632 | 1 | 无效的 | 无效的 | 1 | 3 |
2021 | XS2014184 | 无效的 | 无效的 | 90404990 | 90404990 | 291396632 | 1 | 无效的 | 无效的 | 1 | 3 |
2021 | XS2014184 | 无效的 | 无效的 | 97661111 | 97661111 | 291396632 | 1 | 无效的 | 无效的 | 1 | 3 |
2022 | XS2014184 | 无效的 | 无效的 | 52648 | 52648 | 52648 | 1 | 无效的 | 无效的 | 1 | 1 |
到目前为止我所拥有的:
SELECT
*,
NVL(amt1, 0) + NVL(amt2, 0) + NVL(amt3, 0) total_amt,
NVL(num1, 0) + NVL(num2, 0) + NVL(num2, 0) total_num
FROM Products
我不知道如何获得total_amt_by_prod
and的值total_num_by_prod
。
解决方案
按产品,按年份的总金额..
SUM(NVL(amt1, 0) + NVL(amt2, 0) + NVL(amt3, 0)) OVER(PARTITION BY year, product_code)
并为 num 做类似的事情
OVER/PARTITION BY 有点像要求数据库运行一个子查询,该查询按分区分组并对总和中的任何内容求和,然后根据 year,product_code 的值将其自动加入每一行
即在正常情况下你可能更熟悉它就像
FROM Products
INNER JOIN (SELECT year, product_code, sum(..) as total_by_year_prod FROM Products GROUP BY year, product_code) x
USING(year, product_code)
如果您不继续使用窗口功能,您也可以这样做(但它们是一条更优的路线)
顺便说一句,如果这里只是 amt 列之一中的值,您可以将代码整理到:
COALESCE(amt1,amt2,amt3,0)
COALESCE 从左到右选择它遇到的第一个非空参数
推荐阅读
- angular - 在 DOM 中显示数组
- apache-kafka - 是否可以仅使用 Kafka 连接器 API 将数据从云端传输到本地?
- jquery - 两个 div 停靠和取消停靠
- ios - 关闭 TableViewCell 的 UIViewController
- angularjs - 由于 $$SanitizeUriProvider() 不是构造函数,$injector:modulerr 无法实例化模块 ng
- php - 我正在尝试将表单中的文本字段下拉到 mySQL DB 中,这给我带来了麻烦
- node.js - 在 Node API 中的一定时间后刷新 Oauth 令牌
- c - 将 libcurl 中的 HTML 与文件中的文本进行比较
- sql - 代码中的 .id 是什么意思?它是rowid伪列吗?
- powershell - 查找与程序关联的 msi 卸载 ID,如果存在则卸载