SQL查询 - max(count()) - 没有CTE可能吗?

时间:2015-01-14 13:23:07

标签: sql database postgresql

我目前正在攻读数据库系统考试,但在创建查询时遇到了一些麻烦。

我有四张桌子:

  1. referent -table,包含所指对象的个人资料,
  2. 课程 -table与课程数据(负责的指示对象为外键),
  3. 研讨会 -table与研讨会数据(相应的课程作为外键),
  4. 预订 -table管理预订(与相应的工作室已被预订为外键)
  5. 我的练习是找出指示收入多少钱(在研讨会中有价格 - 列)

    列出他每个工作坊赚多少钱并不是很困难;我创建了这个查询来告诉我:

    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?

    我的教授并没有谈论CTE,而且他的讲义也没有 - 所以 是其他更简单的方法。

    有没有人知道更好的方法来实现这个目标?

    提前致谢!

3 个答案:

答案 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

这完美地解决了我的问题,返回正确的值。

谢谢!