2014-03-26 111 views
0

我正在尋找一些幫助下面的語句。我的意圖是將結果分組爲dom.OutcomeType,只返回結果集中的兩條記錄(也在下面)。有很多分組標準的原因是因爲我使用的是Access 2007,它堅持讓每個返回的值通過語句組合。按SQL語句分組按預期分組

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 

結果 Results

感謝

+0

由於您沒有使用聚合函數,您爲什麼使用GROUP BY? – talegna

+0

在SQL/RA中(它不僅僅是Access!),如果有GROUP BY,那麼每個輸出列*必須在分組或集合函數中指定 - 否則查詢根本沒有意義。 – user2864740

+0

它不只是訪問,但任何數據庫管理系統會讓你這樣做..所有非聚合列必須在組中按條款 – SoulTrain

回答

0

更換

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

GROUP BY dom.OutcomeType 
+0

對於其餘列可能有適當的聚合。 – user2864740

0

要求您將所有這些字段添加到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 

我希望我不會錯過任何括號!

0

你需要做這樣的事情...

我不知道你的數據,但這應該讓你在這個方向開始。

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