我目前正在攻读数据库系统考试,但在创建查询时遇到了一些麻烦。
我有四张桌子:
我的练习是找出指示收入多少钱(在研讨会中有价格 - 列)
列出他每个工作坊赚多少钱并不是很困难;我创建了这个查询来告诉我:
SELECT r.referentid,
r.name,
(SELECT COUNT(*) FROM g22_courses c WHERE c.responsiblerefid = r.referentid)*c.price AS income
FROM referent r
LEFT JOIN g22_courses c ON (c.responsiblerefid = r.referentid)
LEFT JOIN g22_workshop w ON (w.courseid = c.id)
LEFT JOIN g22_booking b ON (b.workshopid = w.id)
GROUP BY r.referentid, c.responsiblerefid
这会返回:
2;"Anna";0.60
4;"Ahmed";3.5
1;"Hans";
2;"Anna";13.20
3;"Wolfgang";
如你所见,它运作正常。
我现在为Anna安排了两个行(因为她负责两个课程..)并想要一个行两个表的总和。
不幸的是,执行此操作的唯一方法(正如我发现的那样)是使用公用表表达式(CTE) - 它可以使用CTE:
WITH incomepercourse AS (
SELECT r.referentid,
r.name,
(SELECT COUNT(*) FROM g22_courses c WHERE c.responsiblerefid = r.referentid)*c.price AS income
FROM referent r
LEFT JOIN g22_courses c ON (c.responsiblerefid = r.referentid)
LEFT JOIN g22_workshop w ON (w.courseid = c.id)
LEFT JOIN g22_booking b ON (b.workshopid = w.id)
GROUP BY r.referentid, c.responsiblerefid
)
SELECT referentid, name, SUM(income) FROM incomepercourse GROUP BY referentid, name
返回:
3;"Wolfgang";
4;"Ahmed";3.50
2;"Anna";13.80
1;"Hans";
我的教授并没有谈论CTE,而且他的讲义也没有 - 所以 是其他更简单的方法。
有没有人知道更好的方法来实现这个目标?
提前致谢!
答案 0 :(得分:0)
您可以如下所示包装CTE部件和查询。
SELECT tbl1.referentid, tbl1.name, SUM(tbl1.income) FROM (
SELECT r.referentid,
r.name,
(SELECT COUNT(*) FROM g22_courses c WHERE c.responsiblerefid = r.referentid)*c.Preis AS income
FROM referent r
LEFT JOIN g22_courses c ON (c.responsiblerefid = r.referentid)
LEFT JOIN g22_workshop w ON (w.courseid = c.id)
LEFT JOIN g22_booking b ON (b.workshopid = w.id)
GROUP BY r.referentid, c.responsiblerefid)tbl1
GROUP BY tbl1.referentid, tbl1.name
答案 1 :(得分:0)
如果您不使用它,则无需加入研讨会和预订表。 如果价格在您的第一个请求中显示在课程表中,我认为您要求的内容可以通过此请求得到解答:
SELECT referent.referentid, referent.name, sum(price)
FROM referent LEFT JOIN g22_courses ON g22_courses.responsiblerefid=referent.id
GROUP BY referent.referentid, referent.name
如果价格在研讨会表格中,只需在此表格中添加联接。
答案 2 :(得分:0)
毕竟我对这个问题的理解是个问题...... ._。
我知道设法在他的评论中说出 a_horse_with_no_name 之类的查询:
SELECT r.referentid,
r.name,
SUM(c.price) AS income
FROM referent r
LEFT JOIN g22_courses c ON (c.responsiblerefid = r.referentid)
LEFT JOIN g22_workshop w ON (w.courseid = c.id)
LEFT JOIN g22_booking b ON (b.workshopid = w.id)
GROUP BY r.referentid
ORDER BY r.referentid
这完美地解决了我的问题,返回正确的值。
谢谢!