Google bigquery 基于字符串列的Bigquery计算值

Google bigquery 基于字符串列的Bigquery计算值,google-bigquery,formula,Google Bigquery,Formula,我有这种桌子 Date Cat1 Nominal 01/05 A 100 01/05 B 200 02/05 C 300 02/05 A 400 03/05 C 200 我需要将每个“Cat1”计算为公式,条件是找不到行,则将其视为“0” 这是我想要的桌子 Date FormulaName Nominal 01/05 A-B+C -100 01/05 B/A 2 02/05 A-B+C 700 02/05 B/A

我有这种桌子

Date  Cat1 Nominal
01/05 A    100
01/05 B    200
02/05 C    300
02/05 A    400
03/05 C    200
我需要将每个“Cat1”计算为公式,条件是找不到行,则将其视为“0” 这是我想要的桌子

Date  FormulaName Nominal
01/05 A-B+C       -100   
01/05 B/A         2
02/05 A-B+C       700
02/05 B/A         0
03/05 A-B+C       200
03/05 B/A         0
如您所见,在01/05时,C未找到,然后被视为“0”,在02/05时与B相同


谢谢

下面是BigQuery标准SQL

#standardSQL
SELECT day, x.*
FROM (
  SELECT day, 
    IFNULL(MAX(IF(cat1 = 'A', nominal, NULL)), 0) AS A,
    IFNULL(MAX(IF(cat1 = 'B', nominal, NULL)), 0) AS B,
    IFNULL(MAX(IF(cat1 = 'C', nominal, NULL)), 0) AS C
  FROM `project.dataset.table`
  GROUP BY day
), UNNEST([
  STRUCT('A - B + C' AS FormulaName, A - B + C AS nominal), 
  ('B / A', IFNULL(SAFE_DIVIDE(B, A), 0))
]) x   
如果要应用于问题中的样本数据,如下例所示

#standardSQL
WITH `project.dataset.table` AS (
  SELECT '01/05' day, 'A' cat1, 100 nominal UNION ALL
  SELECT '01/05', 'B', 200 UNION ALL
  SELECT '02/05', 'C', 300 UNION ALL
  SELECT '02/05', 'A', 400 UNION ALL
  SELECT '03/05', 'C', 200 
)
SELECT day, x.*
FROM (
  SELECT day, 
    IFNULL(MAX(IF(cat1 = 'A', nominal, NULL)), 0) AS A,
    IFNULL(MAX(IF(cat1 = 'B', nominal, NULL)), 0) AS B,
    IFNULL(MAX(IF(cat1 = 'C', nominal, NULL)), 0) AS C
  FROM `project.dataset.table`
  GROUP BY day
), UNNEST([
  STRUCT('A - B + C' AS FormulaName, A - B + C AS nominal), 
  ('B / A', IFNULL(SAFE_DIVIDE(B, A), 0))
]) x    
结果是

Row day     FormulaName nominal  
1   01/05   A - B + C   -100.0   
2   01/05   B / A       2.0  
3   02/05   A - B + C   700.0    
4   02/05   B / A       0.0  
5   03/05   A - B + C   200.0    
6   03/05   B / A       0.0  

('B/A',IFNULL(SAFE_DIVIDE(B,A),0)
我可以将此添加到另一个结构或添加更多公式吗?当然,您可以根据需要添加任意数量的公式-它们应该放在
UNNEST([…])中。
目前有两个