下面的查询向我展示了一个学生名单和他们的基本信息。
我想把男孩和女孩的总和相加,而不必为他们显示单独的列。所以我创建了两个列,然后取其最后和并显示在最后一行中。
第1部分
with ext as (
select s.studentid as SID,p.surname AS Lastname,
p.firstname AS Firstname,
p.sex AS Gender,
p.birthdate AS BDate,
ctf.name as Nation,
SUM(CASE WHEN p.sex = 'MALE' THEN 1 ELSE 0 END) AS BoyCount,
SUM(CASE WHEN p.sex = 'FEMALE' THEN 1 ELSE 0 END) AS GirlCount
from students s
join pupil p on p.id = s.pupilid
join pupilnation pn on pn.pupilid = p.id
join country ctf on ctf.id = pn.coutnryid
...
group by s.studentid, p.surname, p.firstname,p.sex,p.birthdate,ctf.name
)Part2
select SID,Lastname,Firstname,Gender,BDate,Nation
from ext
union all
select 'Students: ' || cast(count(SID) as varchar(6)),
null as Lastname,
null as Firstname,
'Boys: ' || cast(sum(boycount) as varchar(6)) || ' Girls: ' || cast(sum(girlcount) as varchar(6)),
null as Bdate,
string_agg(distinct Nation,',')结果
SID Firstname Gender Bdate Nation
723785 Saria FEMALE 20.01.2012 France
45949 Wenzel MALE 08.11.2011 Germany
3373 Constantin MALE 19.03.2006 Germany
727578 Laurin MALE 08.04.2012 Germany
157 Valerian MALE 15.01.2008 UK
595959 Attila MALE 08.06.2012 USA
4172 Sophie FEMALE 01.11.2004 France
693465 Ibrahim MALE 16.05.2011 Belgium
…
…
12 Students 8 Males 4 Females Germany, France, UK, US, Ughanda预期结果
我希望将每个国家的最后总和以字符串聚合的形式附加到其字符串中。这是否可能如下文所示?德国: 5,法国: 3,英国: 2,美国: 1,乌甘达:1
SID Firstname Gender Bdate Nation
723785 Saria FEMALE 20.01.2012 France
45949 Wenzel MALE 08.11.2011 Germany
…
…
12 Students 8 Males 4 Females Germany: 5, France: 3, UK: 2, US: 1, Ughanda: 1发布于 2018-09-17 09:52:27
您可以通过Nation在select中编写子查询select,然后使用string_agg函数。
select SID,Lastname,Firstname,Gender,BDate,Nation
from ext
union all
select 'Students: ' || cast(count(SID) as varchar(6)),
null as Lastname,
null as Firstname,
'Boys: ' || cast(sum(boycount) as varchar(6)) || ' Girls: ' || cast(sum(girlcount) as varchar(6)),
null as Bdate,
(
select string_agg(cnt , ', ') from
(
SELECT Nation||':'||COUNT(*) cnt
FROM ext
GROUP BY Nation
) t1
)
FROM ext或者您可以使用CROSS JOIN来制作它。
SELECT
'Students: ' || cast(totalCnt as varchar(6)),
null as Lastname,
null as Firstname,
'Boys: ' || cast(boyCnt as varchar(6)) || ' Girls: ' || cast(girlCnt as varchar(6)),
null as Bdate,
v.Nation
FROM (
select
sum(boycount) boyCnt,
sum(girlcount) girlCnt,
count(SID) totalCnt
FROM ext
) t1
CROSS JOIN (
select string_agg(cnt , ', ') Nation from
(
SELECT Nation||':'||COUNT(*) cnt
FROM ext
GROUP BY Nation
) t1
) vhttps://stackoverflow.com/questions/52364634
复制相似问题