基于条件的大查询SQL和值

基于条件的大查询SQL和值,sql,join,count,google-bigquery,Sql,Join,Count,Google Bigquery,我有一个查询,我试图结合表和基于两列的组合求和结果。我希望将表2和表3中的组与表1的名称和计数相匹配。然后,应将计数相加,以便每个名称列出一次。但是,如果工作人员为UU组和Z组,则他/她需要将其Z组计数与UU组计数分开列出。如果此人作为Z组和UU组工作,将被列入两次名单。我需要根据以下示例中门户和组的组合的特定条件来划分结果 Table 1 +--------+------+-------+ | Portal | Name | Count | +--------+------+-------+

我有一个查询,我试图结合表和基于两列的组合求和结果。我希望将表2和表3中的组与表1的名称和计数相匹配。然后,应将计数相加,以便每个名称列出一次。但是,如果工作人员为UU组和Z组,则他/她需要将其Z组计数与UU组计数分开列出。如果此人作为Z组和UU组工作,将被列入两次名单。我需要根据以下示例中门户和组的组合的特定条件来划分结果

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的门户B被单独计算,因为他在组UU中。组UU只在门户B中工作。Bob的门户A和C相加,因为他是这些门户中的组Z。同时,Joe将所有计数汇总到一行中,因为他根本不是UU。提前感谢您的帮助。

我认为您正在尝试根据门户的价值使用不同的映射表。如果是,您可以执行以下操作:

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

如果任何组表中可能缺少记录,请改用左联接。

下面是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   
有输出

Row grp name    cnt  
1   Z   Bob     8    
2   UU  Bob     2    
3   Y   Joe     12   

这些组和门户如何关联?你的样本数据没有这方面的迹象。另一方面,您必须创建一个用户组表,其目的似乎不明确。您应该更详细地解释输出中的每一行。到目前为止-这是非常不清楚和混乱的点,没有任何意义请解释你如何计算8和2。你怎么知道A和C和Z在一起?唯一的关系是组UU总是在门户B中。除此之外,没有关系。任何小组都可以在任何门户中工作。输出:Bob在每个门户中都是Z,门户B除外。通过将门户A和门户C的计数加上5+3,可以得到8。Bob是门户B中的UU,因此我们从门户B中得到2。Joe是组Y,因此我们将他所有门户中的所有计数相加,而不进行任何分离。一个人可以是组Z和组UU,但他们只能在门户B中作为组UU工作。我正在做的是将组添加到名称中,并将所有门户的计数相加。唯一的例外是,当一个人是组UU角色(仅在门户B中出现)时,该计数需要分开。不幸的是,此方法没有分开,它按预期按组列出了组UU和组B的人员,但没有分开计数。我假设将表3别名标记为t2是一个错误。您的输出是Z Bob 10,后面是UU Bob 10。您希望查看整个84行查询吗?它做我想要的一切,除了当我有一个人Bob和组UU和组Z时,Bob的被列为组UU两次,第一次是计数加倍,然后是四倍。我担心如果我发布了全部代码,如果有人花时间,我会花一周的时间来解释。这就成功了。它确实列出了两次像Bob这样的人,尽管他们只在门户B中工作,不一定是我想要的,但计数为0,不应该影响加权平均数。我可以解决这个问题。我向您致敬,感谢您抽出时间。若要删除此类条目,您可以将cnt>0添加到查询末尾。考虑接受答案如果它对你有用:O