繁体   English   中英

Big Query SQL 根据条件求和值

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM