我在 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 来做到这一点
您可以使用
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;
如果您有比这更复杂的映射,那么最好创建一个包含所有映射的真实表,然后从主表连接到该表。
使用映射表似乎是一个简单的连接,例如
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)
但是您正在失去这样一个事实:不同的产品可以出现在一个组中。