我有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中是不允许的”
知道我在做什么错以及为什么该查询无法正常工作吗?
答案 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