如何将SUMS从2个不同的表合并为1个

时间:2019-02-16 21:25:23

标签: sql

我有2张桌子

表1 =日志

@Entity
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
class Resident {
...

表2 =人数

Site   Year   Quarter    SF    Seats  
 ------ ------ --------- ------ ------- 
  NYC    2019   Q1        1000      34  
  NYC    2019   Q1        1289      98  
  CHI    2019   Q1         976      17  
  NYC    2019   Q2        3985     986 

我需要能够将这些表连接在一起,并显示每个不同站点,季度和年份的SF,席位和HC的总和

例如,输出应为:

Site   Year   Quarter   HC     
 ------ ------ --------- -------  
  NYC    2019   Q1           63     
  NYC    2019   Q1           34     
  CHI    2019   Q1           73     
  NYC    2019   Q2           23  

这是我的SQL查询:

 Site   Year   Quarter   HC    SF    Seats  
 ------ ------ --------- ------- ------ ------- 
  NYC    2019   Q1           97   2289     132  
  NYC    2019   Q2           23   3985     986  
  CHI    2019   Q1           73    976      17 

但是我收到此错误消息“ HC列包含聚合函数,在GROUP BY中是不允许的”

知道我在做什么错以及为什么该查询无法正常工作吗?

2 个答案:

答案 0 :(得分:1)

该错误的原因是,在上一个子查询中,您在HC子句中有group by,同时还与sum(HC)进行了聚合。那是不允许的。应该是另一个。

但是,cross join将合并第一个子查询的所有行,以及第二个子查询的所有行。当然,这不是您所需要的。

此外,使用distinct时不需要group by。您无法使用group by获得副本。

我建议使用union all

SELECT    SITE,
          YEAR,
          QUARTER,
          SUM(HC),
          SUM(SEATS),
          SUM(SF)
FROM      (
            SELECT  SITE,
                    YEAR,
                    QUARTER,
                    HC,
                    null AS SEATS,
                    null AS SF
            FROM    Headcount
            UNION ALL
            SELECT  SITE,
                    YEAR,
                    QUARTER,
                    null,
                    SEATS,
                    SF
            FROM    Log
          ) AS base
GROUP BY  SITE,
          YEAR,
          QUARTER

答案 1 :(得分:0)

由于两个表之间存在N-M关系,您需要在子查询中进行汇总,然后将结果结合在一起:

SELECT h.*, l.SF, l.Seats
FROM 
    (
        SELECT site, year, quarter, SUM(SF) SF, SUM(Seats) Seats
        FROM LOG 
        GROUP BY site, year, quarter
    ) l
    INNER JOIN (
        SELECT site, year, quarter, SUM(HC) HC
        FROM Headcount 
        GROUP BY site, year, quarter
    ) h 
    ON h.site = l.site AND h.year = l.year AND h.quarter = l.quarter