【问题标题】:Aggregating Output Based on Corresponding Values in a 3rd Table根据第三个表中的对应值汇总输出
【发布时间】:2021-01-13 21:31:26
【问题描述】:

我需要帮助来解决这个问题。

为了获得最终输出,引用了三个表,但需要以非常特定的方式输出。

first表有QID,它们是分发给相应ClassID学生的问卷。 每个 ClassID 对应一个部分,可以让多个学生回答问卷。

second 表具有 RID,它是收到的问卷回复的标识符。 (我使用它来获取按 QID 分组的 RID 的计数,这给了我总响应 - 在输出表中引用为 TotalR,指向 QID/ClassID)

第三个表告诉我们哪些类ClassID是横截面CrossID,这意味着EDU 103是与 EDE 101 相同,因此在计数时应将 EDU 103 和 EDE 101 的响应相加。 (这就是我卡住的地方,因为我不确定如何利用这张桌子。)

最终输出应显示所有 QuestionaireID 及其响应总和。此表列出了所有 QID 及其对应的 ClassID。然而,TotalR 是其中 ClassID = ClassID OR ClassID = CrossID 的 RID 的总和。

表 1 - 问卷调查

QID ClassID
21 CMP 101
22 EDU 103
23 EDE 101

表 2 - 回复

RID QID
12 21
13 22
14 23
15 21
16 23

表 3 - 交叉课程

ClassID CrossID
EDU 103 EDE 101
EDE 101 EDU 103

期望的输出

QID ClassID TotalR
21 CMP 101 2
22 EDU 103 3
23 EDE 101 3

【问题讨论】:

    标签: sql sql-server


    【解决方案1】:

    可能有更好的方法来做到这一点。但这是我能想到的。

    SELECT a.QID,a.CLASSID,count(a.rid) as totalR
    from
    (
    SELECT distinct q.qid,q.classid,r.rid
    from Question Q
    left join CrossCourse cc on cc.CLASSID = q.CLASSID
    left join Question Q2 on Q2.CLASSID = cc.CROSSID
    left join Response R on q.qid = r.qid or q2.QID = r.qid
    )a 
    group by a.qid,a.classid
    

    本质上,我们在问题 Q2 上进行第二次连接,以便我们获得初始 CLASSID 的叉积名称的 QID。从那里,我们加入两个 QID 以获得总响应数。

    使用您提供的数据和架构获取上下文的 SQL 小提琴: http://sqlfiddle.com/#!9/4c4a60/10

    【讨论】:

    • 感谢您分享此内容。在示例中,我们在 Q2.ClassID = cc.CrossID 上进行了左连接。如果只有许多其他多个类/交叉组合,那会起作用吗?
    • 我会在 SQL Server 上试试这个并回复你。
    • 嗯,从这个意义上说,我的答案可能无法扩展。我已经更新了查询,基本上为每个问题采用了不同的响应类型。有相当多的假设,每个 CrossCourse 选项都在表中。如果 101 有 103 和 105 的别名,而 103 没有 105 的别名,就会有间隙。
    猜你喜欢
    • 2016-11-12
    • 2021-07-05
    • 2016-11-13
    • 1970-01-01
    • 2011-04-17
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    相关资源
    最近更新 更多