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
我有这种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