如何运行子查询将表拆分为两组?

时间:2016-03-31 11:25:48

标签: sql postgresql google-bigquery

我有一张名为spending的桌子(实际上在BigQuery中,虽然我不认为这个问题必然与此问题相关),大约有2.9GB和1900万行。

数据结构如下:

product,org,spend,to_include,proportion_overseas
----------------------------------
SK001,03V,"Yes",0.1
SK002,03V,2.4,"Yes",0.1
SK001,O3T,66.1,"No",0.47
SK002,03T,87.1,"No",0.47
SK001,04C,16.1,"Yes",0
SK002,04C,27.1,"Yes",0
...

有关信息,它略有非规范化,因为to_includeproportion_overseas实际上是每个组织的属性。

现在我想解决每个产品:

  • 所有没有海外支出的组织在该产品上花费的总金额,
  • 所有具有非零海外支出的组织在该产品上花费的总金额。

我也只想在此计算中仅包含to_include='Yes'的行。

我不确定在SQL中执行此操作的最佳方法是什么。我不介意我最终得到两张桌子还是一张桌子。

我知道如何通过代码获取所有相关行的所有支出:

SELECT product, SUM(spend) 
FROM spending 
WHERE to_include='Yes'
GROUP BY product;

但我不知道的是如何将每一行分成两组:一组proportion_overseas=0和一组proportion_overseas>0

我不认为'子查询'是正确的术语,所以我真的不知道谷歌会做些什么!

1 个答案:

答案 0 :(得分:0)

您可以使用条件聚合:

SELECT product, SUM(spend),
       SUM(CASE WHEN proportion_overseas = 0 THEN spend ELSE 0 END) as not_overseas,
       SUM(CASE WHEN proportion_overseas > 0 THEN spend ELSE 0 END) as overseas
FROM spending 
WHERE to_include='Yes'
GROUP BY product;