是否可以根据某种映射进行分组?

问题描述 投票:0回答:2

我在 BigQuery 中有一个表,我希望能够根据某种类型的映射文件进行分组,例如,如果我有以下内容

产品代码 国家 销售
AA1 美国 5
AA2 美国 10
AA1 英国 15
BB1 美国 20
BB2 美国 25
BB2 英国 25

以及以下映射

[AA1, AA2] > AA1
[BB1, BB2] > BB1

我理想地希望获得以下内容:

产品代码 国家 销售
AA1 美国 15
AA1 英国 15
BB1 美国 45
BB1 英国 25

显然除了更大的规模之外。我想知道是否有一种方法可以纯粹用 SQL 来做到这一点

sql mysql google-bigquery
2个回答
0
投票

您可以使用

CASE
表达式进行聚合,该表达式执行映射:

SELECT
    CASE WHEN ProductCode IN ('AA1', 'AA2') THEN 'AA1'
         WHEN ProductCode IN ('BB1', 'BB2') THEN 'BB1' END AS ProductCode,
    Country,
    SUM(Sales) AS Sales
FROM yourTable
GROUP BY 1, 2;

如果您有比这更复杂的映射,那么最好创建一个包含所有映射的真实表,然后从主表连接到该表。


0
投票

使用映射表似乎是一个简单的连接,例如

drop table if exists t,mapping;

create table t
(ProductCode varchar(3),    Country varchar(2), Sales int);
insert into t values
('AA1', 'US'    ,5),
('AA2', 'US'    ,10),
('AA1', 'UK'    ,15),
('BB1', 'US'    ,20),
('BB2', 'US'    ,25),
('BB2', 'UK'    ,25);

create table mapping
(productcode varchar(3),grp varchar(3));
insert into mapping values
('aa1','aa1'),('aa2','aa1'),('bb1','bb1'),('bb2','bb1');

SELECT
     grp,
    Country,
    SUM(Sales) AS Sales
FROM t
join mapping on t.ProductCode = mapping.productcode
GROUP BY grp,country desc;

+------+---------+-------+
| grp  | Country | Sales |
+------+---------+-------+
| aa1  | US      |    15 |
| aa1  | UK      |    15 |
| bb1  | US      |    45 |
| bb1  | UK      |    25 |
+------+---------+-------+
4 rows in set (0.001 sec)

但是您正在失去这样一个事实:不同的产品可以出现在一个组中。

© www.soinside.com 2019 - 2024. All rights reserved.