[英]Big Query SQL sum values based on conditions
我有一个查询,我试图根据两列的组合来组合表和求和结果。 我想将表 2 和 3 中的组与表 1 的名称和计数相匹配。然后,计数应该相加,以便每个名称都列出一次。 但是,如果工作的人是 UU 组和 Z 组,那么他/她应该需要将他们的组 Z 计数与他们的组 UU 计数分开列出。 如果此人作为 Z 组和 UU 组工作,他们将被列出两次。 我需要根据特定条件拆分结果(下例中 Portal 和 Group 的组合)
Table 1
+--------+------+-------+
| Portal | Name | Count |
+--------+------+-------+
| A | Bob | 3 |
| A | Joe | 6 |
| B | Joe | 6 |
| B | Bob | 2 |
| C | Bob | 5 |
+--------+------+-------+
Table 2
+-------+------+
| Group | Name |
+-------+------+
| Z | Bob |
| Y | Joe |
+-------+------+
Table 3
+-------+------+
| Group | Name |
+-------+------+
| UU | Bob |
| UU | Jill |
+-------+------+
Output
+-------+------+-------+
| Group | Name | Count |
+-------+------+-------+
| Z | Bob | 8 |
| UU | Bob | 2 |
| Y | Joe | 12 |
+-------+------+-------+
请注意,Bob 的 Portal B 被单独计算,因为他在 Group UU 中。 UU 组仅适用于门户 B。Bob 的门户 A 和 C 被加在一起,因为他是这些门户中的 Z 组。 与此同时,Joe 将他的所有计数汇总在一行中,因为他根本不是 UU。 提前感谢您的任何见解。
以下是 BigQuery 标准 SQL
试试下面
#standardSQL
WITH table1 AS (
SELECT 'A' portal, 'Bob' name, 3 cnt UNION ALL
SELECT 'A', 'Joe', 6 UNION ALL
SELECT 'B', 'Joe', 6 UNION ALL
SELECT 'B', 'Bob', 2 UNION ALL
SELECT 'C', 'Bob', 5
), table2 AS (
SELECT 'Z' grp, 'Bob' name UNION ALL
SELECT 'Y', 'Joe'
), table3 AS (
SELECT 'UU' grp, 'Bob' name UNION ALL
SELECT 'UU', 'Jill'
), all_groups AS (
SELECT * FROM table2 UNION ALL
SELECT * FROM table3
)
SELECT grp, name,
SUM(
CASE
WHEN grp = 'UU' THEN
CASE WHEN portal = 'B' THEN cnt ELSE 0 END
WHEN grp != 'UU' AND flag THEN
CASE WHEN portal = 'B' THEN 0 ELSE cnt END
ELSE cnt
END
) cnt
FROM (
SELECT a.grp, a.name, b.portal, b.cnt,
0 != COUNTIF(grp = 'UU') OVER(PARTITION BY a.name) flag
FROM all_groups a
JOIN table1 b
ON a.name = b.name
)
GROUP BY grp, name
与 output
Row grp name cnt
1 Z Bob 8
2 UU Bob 2
3 Y Joe 12
我认为您正在尝试根据门户的值使用不同的映射表。 如果是这样,您可以这样做:
select
case when portal = 'B' then t3.group else t2.group end as grp,
t1.name,
sum(count) cnt
from table1 t1
inner join table2 t2 on t2.name = t1.name
inner join table3 t2 on t2.name = t1.name
group by 1, 2
如果您可能在任何组表中缺少记录,请改用left join
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.