【问题标题】:Group By in SQL Statement Not Grouping as ExpectedSQL 语句中的 Group By 未按预期分组
【发布时间】:2014-03-26 16:09:06
【问题描述】:

我正在就以下声明寻求帮助。我的意图是按dom.OutcomeType 对结果进行分组,只返回结果集中的两条记录(也在下面)。有这么多分组条件的原因是因为我使用的是 Access 2007,它坚持在 group by 语句中包含每个返回值。

SQL 语句

SELECT d.DiagnosticId, d.AbsenceId, dqm.QuestionNumber, dq.Question, dqm.AnswerId, dom.OutcomeType, do.Outcome, d.AcceptedId, d.Reason
FROM (((ct_adt_Diag d
    INNER JOIN ct_adt_DiagOMatch dom ON d.DiagnosticId = dom.DiagnosticId)
    INNER JOIN ct_adt_DiagOutcome do ON dom.OutcomeId = do.OutcomeId)
    INNER JOIN ct_adt_DiagQAMatch dqm ON d.DiagnosticId = dqm.DIagnosticId)
    INNER JOIN ct_adt_DiagQuestion dq ON dqm.QuestionId = dq.QuestionId
WHERE d.AbsenceId = 19
GROUP BY dom.OutcomeType, d.DiagnosticId, d.AbsenceId, dq.Question, dqm.AnswerId, dqm.QuestionNumber, do.Outcome, d.AcceptedId, d.Reason
ORDER BY d.DiagnosticId, dqm.QuestionNumber

结果

谢谢

【问题讨论】:

  • 既然你没有使用聚合函数,为什么要使用GROUP BY
  • 在 SQL/RA 中(不仅仅是 Access!),如果有 GROUP BY,则每个输出列 必须 在分组或聚合函数中指定 - 或查询根本没有意义。
  • 它不只是 ACCESS,任何 DBMS 都会让你这样做。所有非聚合列必须在 Group by Clause 中
  • 您可能会发现 this question 在子查询中使用 GROUP BY 来限制返回的结果时很有帮助。您似乎完全误解了GROUP BY 的用法,可能应该考虑如何汇总结果。
  • 是什么让你怀疑记录多了(“只返回两条记录”)?当您运行 Select * From ct_adt_Diag d Where d.AbsenceId = 19 时会发生什么?

标签: sql ms-access group-by


【解决方案1】:

替换

GROUP BY dom.OutcomeType, d.DiagnosticId, d.AbsenceId, dq.Question, dqm.AnswerId, dqm.QuestionNumber, do.Outcome, d.AcceptedId, d.Reason

GROUP BY dom.OutcomeType

【讨论】:

  • 可能在剩余的列上进行适当的聚合。
【解决方案2】:

您需要将所有这些字段添加到 GROUP BY 子句,因为 Access 将您的整个查询视为聚合查询。您可以将查询拆分为两个查询,也可以在一个凌乱的语句中完全完成,如下所示:

SELECT d.DiagnosticId, d.AbsenceId, dqm.QuestionNumber, dq.Question, dqm.AnswerId, 
dom.OutcomeType, do.Outcome, d.AcceptedId, d.Reason
FROM (((ct_adt_Diag As d
INNER JOIN (
    SELECT dom.OutcomeType
    FROM ct_adt_DiagOMatch As dom
    GROUP BY dom.OutcomeType
) ON d.DiagnosticId = dom.DiagnosticId)
INNER JOIN ct_adt_DiagOutcome do ON dom.OutcomeId = do.OutcomeId)
INNER JOIN ct_adt_DiagQAMatch dqm ON d.DiagnosticId = dqm.DIagnosticId)
INNER JOIN ct_adt_DiagQuestion dq ON dqm.QuestionId = dq.QuestionId
WHERE d.AbsenceId = 19
ORDER BY d.DiagnosticId, dqm.QuestionNumber

我希望我没有遗漏任何括号!

【讨论】:

    【解决方案3】:

    你需要做这样的事情......

    我不知道你的数据,但这应该能让你朝着那个方向开始。

        WITH CTE
    AS (
        SELECT d.DiagnosticId
            , MIn(d.AbsenceId) AbsenceId
            , MIN(dqm.QuestionNumber) QuestionNumber
            , MIN(dq.Question) Question
            , MIN(dqm.AnswerId) AnswerId
            , MIN(dom.OutcomeType) OutcomeType
            , MIN(do.Outcome) Outcome
            , MIn(d.AcceptedId) AcceptedId
            , MIN(d.Reason) Reason
            , ROW_NUMBER() OVER (
                PARTITION BY dom.OutcomeType ORDER BY d.DiagnosticId,, dqm.QuestionNumber
                ) rownum
        FROM (
            (
                (
                    ct_adt_Diag d INNER JOIN ct_adt_DiagOMatch dom
                        ON d.DiagnosticId = dom.DiagnosticId
                    ) INNER JOIN ct_adt_DiagOutcome do
                    ON dom.OutcomeId = do.OutcomeId
                ) INNER JOIN ct_adt_DiagQAMatch dqm
                ON d.DiagnosticId = dqm.DIagnosticId
            )
        INNER JOIN ct_adt_DiagQuestion dq
            ON dqm.QuestionId = dq.QuestionId
        WHERE d.AbsenceId = 19
        GROUP BY dom.OutcomeType
            , d.DiagnosticId    
        )
    SELECT *
    FROM CTE
    WHERE rownum <= 2
    

    【讨论】:

      猜你喜欢
      • 2021-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-06
      • 1970-01-01
      • 2020-10-26
      • 1970-01-01
      • 2017-09-02
      相关资源
      最近更新 更多