按列值查询某些行的联合和分组
Posted
技术标签:
【中文标题】按列值查询某些行的联合和分组【英文标题】:Query for union and grouping of some rows by column values 【发布时间】:2021-08-12 11:33:40 【问题描述】:我有一个名为 Products 的表。我正在尝试编写一个查询来根据year
和product_code
对total_amt
和total_num
的值求和。
total_amt_by_prod
和 total_num_by_prod
是预期的输出。
year | product_code | amt1 | amt2 | amt3 | total_amt | total_amt_by_prod | num1 | num2 | num3 | total_num | total_num_by_prod |
---|---|---|---|---|---|---|---|---|---|---|---|
2020 | LA2013288 | 10000 | NULL | NULL | 10000 | 10000 | 4 | 1 | 3 | 8 | 8 |
2021 | XS2014184 | NULL | NULL | 103330531 | 103330531 | 291396632 | 1 | NULL | NULL | 1 | 3 |
2021 | XS2014184 | NULL | NULL | 90404990 | 90404990 | 291396632 | 1 | NULL | NULL | 1 | 3 |
2021 | XS2014184 | NULL | NULL | 97661111 | 97661111 | 291396632 | 1 | NULL | NULL | 1 | 3 |
2022 | XS2014184 | NULL | NULL | 52648 | 52648 | 52648 | 1 | NULL | NULL | 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
和total_num_by_prod
的值。
【问题讨论】:
你考虑过/尝试过窗口函数吗? 为什么产品代码 XS2014..“产品总量”有两个不同的值?它实际上是“按年按产品计算的总金额”吗? @CaiusJard 是的,按年份和产品分类 @DaleK 删除了图片 【参考方案1】:按产品分类的总金额,按年份..
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 从左到右选择它遇到的第一个非空参数
【讨论】:
我使用了 OVER/PARTITION。感谢您的回答! amt1、amt2 和 amt3 中都有值,但我只是没有显示所有行。 COALESCE 对我来说是一个新概念,感谢您也将其添加到您的答案中!【参考方案2】:select year, product_code,
sum(isnull(amt1, 0) + isnull(amt2, 0) + isnull(amt3, 0)) total_amt,
sum(isnull(num1, 0) + isnull(num2, 0) + isnull(num2, 0)) total_num
from Products
group by year, product_code
【讨论】:
我的好答案包括对您如何解决问题的描述以及工作代码。以上是关于按列值查询某些行的联合和分组的主要内容,如果未能解决你的问题,请参考以下文章