Bigquery 根据字符串列计算值

Bigquery calculating values based on string column

我有这种table

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” 这是我的预期 table

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