按列值查询某些行的并集和分组
Query for union and grouping of some rows by column values
我有一个名为 Products 的 table。我正在尝试编写一个查询以根据 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
的值。
按产品分类的总金额,按年份..
SUM(NVL(amt1, 0) + NVL(amt2, 0) + NVL(amt3, 0)) OVER(PARTITION BY year, product_code)
并为 num
做类似的事情
OVER/PARTITION BY 有点像要求数据库 运行 一个子查询,该子查询按分区分组并对总和中的任何内容求和,然后根据年份值,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)
如果您不继续使用 window 函数,您也可以这样做(但它们是稍微更优的路线)
顺便说一下,如果这里只是其中一个 amt 列中的值,您可以将代码整理为:
COALESCE(amt1,amt2,amt3,0)
COALESCE 从左到右选择它遇到的第一个非空参数
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
我有一个名为 Products 的 table。我正在尝试编写一个查询以根据 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
的值。
按产品分类的总金额,按年份..
SUM(NVL(amt1, 0) + NVL(amt2, 0) + NVL(amt3, 0)) OVER(PARTITION BY year, product_code)
并为 num
做类似的事情OVER/PARTITION BY 有点像要求数据库 运行 一个子查询,该子查询按分区分组并对总和中的任何内容求和,然后根据年份值,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)
如果您不继续使用 window 函数,您也可以这样做(但它们是稍微更优的路线)
顺便说一下,如果这里只是其中一个 amt 列中的值,您可以将代码整理为:
COALESCE(amt1,amt2,amt3,0)
COALESCE 从左到右选择它遇到的第一个非空参数
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