2009-08-25 91 views
1

我有一個包含StudyId,PatientId和StudyStartDateTime的表。我想繪製兩個日期之間的研究和患者的總數。用戶的問題是計算不同的值下面是該查詢:。訪問2007年:「SELECT COUNT(DISCTINCT ...」

SELECT 
    s.StudyStartDateTime, 
    COUNT(s.StudyId), 
    COUNT(s.PatientId) 
FROM 
    dbo_Study_ViewX211_Rpt AS s 
WHERE 
    s.StudyStartDateTime>=Forms![StudiesPatientsByDate]!txtStartDate, 
    s.StudyStartDateTime<=Forms![StudiesPatientsByDate]!txtEndDate 
GROUP BY s.StudyStartDateTime 
ORDER BY s.StudyStartDateTime; 

此查詢的工作幾乎,因爲它應該,但它計數與同StudyId或同一PatientId行的重複我知道訪問不支持COUNT(DISTINCT ...),但是我在解決這個問題時遇到了很多麻煩,任何幫助都將非常感謝,

+0

問題:數據存儲在JET表中還是傳遞給SQL(打開更多選項)? – JohnFx

+0

數據最初存儲在SQL Server 2005中。出於開發目的,我已經將數據轉儲並導入到Access中。理想情況下,我認爲無論數據源是服務器還是導入到Access的轉儲,Access接口都可以工作。 – Richard

回答

1

您可以嘗試使用subqu eries的計數,但相關的子查詢傾向於咬性,當談到性能。

如果你是開放的兩個查詢,而不是一個這樣做,這會工作:

SELECT 
    s.StudyStartDateTime, 
    COUNT(s.PatientId) 
FROM 
    dbo_Study_ViewX211_Rpt AS s 
WHERE 
    s.StudyStartDateTime>=Forms![StudiesPatientsByDate]!txtStartDate, 
    s.StudyStartDateTime<=Forms![StudiesPatientsByDate]!txtEndDate 
GROUP BY s.StudyStartDateTime, s.PatientId 
ORDER BY s.StudyStartDateTime; 


SELECT 
    s.StudyStartDateTime, 
    COUNT(s.StudyId), 
FROM 
    dbo_Study_ViewX211_Rpt AS s 
WHERE 
    s.StudyStartDateTime>=Forms![StudiesPatientsByDate]!txtStartDate, 
    s.StudyStartDateTime<=Forms![StudiesPatientsByDate]!txtEndDate 
GROUP BY s.StudyStartDateTime, s.StudyId 
ORDER BY s.StudyStartDateTime; 

注意,我添加了數場到GROUP BY中的每個表達式。

如果您想使其更加「緊湊」,您可以爲每個查詢創建一個視圖,並將它們連接到StudyStartDateTime上的不同查詢以將結果全部獲取到一個結果集中。

+0

但是,這是如何計數不同的行? – Richard

+0

不同的行?您的問題在PatiendID和StudyID中要求不同的值。不同的行是另一個問題。 – JohnFx

1

注意到dbo_前綴 - 是否鏈接到SQL Server數據庫?

如果是這樣,您可以使用傳遞查詢並使用COUNT(DISTINCT ...)語法,因爲它將直接傳遞給SQL Server。

+0

它是,但不幸的是它也需要在Access-only拷貝上工作。 – Richard

0

在一個單獨的回答把這個所以它可以獨立進行表決,但該博客文章有關使用子查詢的方式做這個講座:

Writing a Count(Distinct) Query in Access

+0

這是我發現的第一篇文章。到目前爲止,我一直無法採用這種方法。我認爲麻煩來自這樣一個事實,即雖然他只有一個必須明確的價值,但我有兩個。 – Richard

+0

要添加到我以前的評論,問題是,因爲他只有一列,他需要是不同的,他不必擔心加入這兩個單獨的SELECT DISTINCT查詢。 – Richard

+0

訣竅是加入兩個耙表(子查詢)而不是一個。每次計數一次(基本上是我在其他答案中提出的兩個問題) – JohnFx

0

我已經採取JohnFx的建議,和我已經創建了這兩個子查詢:

numStudiesByDate:

SELECT 
    t.StudyStartDateTime, 
    COUNT(s.StudyId) AS numStudies 
FROM 
    (SELECT DISTINCT 
     StudyId 
    FROM 
     dbo_Study_ViewX211_Rpt 
    GROUP BY StudyId) AS s 
INNER JOIN 
    dbo_Study_ViewX211_Rpt AS t 
ON t.StudyId=s.StudyId 
WHERE 
    t.StudyStartDateTime>=Forms![StudiesPatientsByDate]!txtStartDate, 
    t.StudyStartDateTime<=Forms![StudiesPatientsByDate]!txtEndDate 
GROUP BY t.StudyStartDateTime 
ORDER BY t.StudyStartDateTime; 

numPatientsByDate:

SELECT 
    t.StudyStartDateTime, 
    COUNT(s.PatientId) AS numPatients 
FROM 
    (SELECT DISTINCT 
     PatientId 
    FROM 
     dbo_Study_ViewX211_Rpt 
    GROUP BY PatientId) AS s 
INNER JOIN 
    dbo_Study_ViewX211_Rpt AS t 
ON t.PatientId=s.PatientId 
WHERE 
    t.StudyStartDateTime>=Forms![StudiesPatientsByDate]!txtStartDate, 
    t.StudyStartDateTime<=Forms![StudiesPatientsByDate]!txtEndDate 
GROUP BY t.StudyStartDateTime 
ORDER BY t.StudyStartDateTime; 

而最終查詢:

numStudiesPatientsByDate:

SELECT 
    s.StudyStartDateTime, 
    s.numStudies, 
    p.numPatients 
FROM 
    numStudiesByDate AS s 
INNER JOIN 
    numPatientsByDate AS p 
ON 
    s.StudyStartDateTime = p.StudyStartDateTime; 

感謝所有幫助,並希望別人發現這個有用!

+0

即使您已經改變了他的建議,您是否應該給予他答案? –