【问题标题】:Group by many to many table按多对多表分组
【发布时间】:2017-08-29 08:08:21
【问题描述】:

我有下表:

performance
  --id
  --color
  --installs
  --date

performance_groups
  --id
  --performance_id
  --group_id

我想要一个类似这样的 SQL:

 SELECT color, targeting_id, SUM(installs) as installs
 FROM performance, performance_groups
GROUP BY color, group_id

但我希望对所有组进行分组。

例如:

performance
id     color     installs   date
1      Blue      5          2017-07-05
2      Red       10         2017-07-04
3      Blue      10         2017-07-04
4      Blue      10         2017-07-05

performance_groups
id   performance_id   group_id
1    1                1
2    1                2
3    2                3
4    3                1
5    3                2
6    4                1
7    4                3

我想得到这样的结果:

color group_ids installs
Blue  1,2     15
Red   3       10
Blue  1,3     10

【问题讨论】:

    标签: sql postgresql group-by


    【解决方案1】:

    永远不要FROM 子句中使用逗号。始终使用正确、明确的 JOIN 语法。

    您的查询似乎是JOINGROUP BY

    select p.color, string_agg(pg.group_id) as groups, 
           sum(installs) as installs
    from performance p join
         performance_groups pg
         on pg.performance_id = p.id
    group by color;
    

    【讨论】:

    • 谢谢。我正在检查它 - 你能详细说明加入和逗号之间的区别吗?
    • JOIN 是正确的语法。逗号是一种古老的语法,已经过时了二十多年。
    【解决方案2】:

    感谢 Gordon 和 Radium,我的回答得到了启发。

    最终的解决方案是:

    with pg as(
        select performance_id, array_agg(distinct group_id) as groups from performance_groups
        group by performance_id
    ) 
    select groups, sum(installs) from performance join pg 
    on pg.performance_id = performance.id
    group by groups
    

    查看工作sqlfiddle

    【讨论】:

      【解决方案3】:

      使用array_agg,不要忘记不同的。连接可能会产生重复。

      select p.color, array_agg(distinct pg.group_id) as groups, 
             sum(distinct installs) as installs
      from performance p 
      join performance_groups pg
           on pg.performance_id = p.id
      group by color;
      

      sqlfiddle demo

      【讨论】:

      • 听起来是正确的答案。将检查更多并更新
      【解决方案4】:
      We are using STUFF,XML PATH and GROUP BY in SQL 2008.
      

      代码:

          select f.color,
          (SELECT STUFF(( SELECT ',' + convert(varchar(5),j.group_id) 
          FROM (select distinct g.group_id from performance_groups g 
          where g.performance_id in (select id from performance where color= 
          f.color)) j FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, 
          '')) as group_ids,
          SUM(f.installs) installs
          from performance f group by color
      

      输出:

      color   group_ids   installs
      Blue    1,2         15
      Red     3           10
      

      【讨论】:

      • 但我使用的是 postgres sql - 它有什么帮助?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-01
      相关资源
      最近更新 更多