2017-04-06 49 views
0

我有一個查詢,使用子查詢從2個獨立的表中計數2列,該工作。現在我必須在這個查詢中實現根據通話記錄的日期過濾掉這些結果的能力。我將發佈我正在使用的查詢:從兩個日期之間的單獨表中計數2列

SELECT (m.FirstName || " " || m.LastName) AS Members, 
    (
     SELECT count(CallToLineOfficers.MemberID) 
     FROM CallToLineOfficers 
     WHERE CallToLineOfficers.MemberID = m.MemberID 
    ) 
+ (
     SELECT count(CallToMembers.MemberID) 
     FROM CallToMembers 
     WHERE CallToMembers.MemberID = m.MemberID 
    ) AS Tally 
FROM Members AS m, Call, CallToMembers, CallToLineOfficers 
Join Call on CallToMembers.CallID = Call.CallID 
and CallToLineOfficers.CallID = Call.CallI 
WHERE m.FirstName <> 'None' 
-- and Call.Date between '2017-03-21' and '2017-03-22' 
GROUP BY m.MemberID 
ORDER BY m.LastName ASC; 

好吧,所以表呼叫存儲日期和它的PK是CallID。 CallToLineOfficers和CallToMembers都是隻包含CallID和MemberID的橋表。在當前查詢中,日期被註釋掉,該日期範圍應該只返回所有名字,但計數1應該出現在1人名下。

我曾嘗試加入Call.CallID與兩個橋表Call's沒有任何運氣,但我認爲這是正確的方式來做到這一點。有人能幫助我指出正確的方向嗎?我搞不清楚了。 (我試圖解釋這一盡我所能,所以如果你需要更多的信息,讓我知道。)

更新:這裏是我得到的截圖:基於

Count

在樣本中提供日期,新日期的結果應爲:

Bob Clark - 1 
Rob Catalano - 1 
Matt Butler - 1 
Danielle Davidson - 1 
Jerry Chuska - 1 
Tom Cramer - 1 

Everyone else should be 0. 
+0

樣本數據和期望的結果將是有益的。無論如何,它看起來好像你忘了加入'm'和'Call'表。 –

+0

本來我有他們在那裏,但似乎無法弄清楚他們是否正確。我會讀它們,並提供我得到的和我應該得​​到的截圖。 – RockGuitarist1

回答

1

此刻,子查詢僅對成員標識進行過濾。因此,對於外部查詢中的任何成員標識,它們將返回完整的計數。

以減少計數,你在子查詢過濾:

SELECT (FirstName || " " || LastName) AS Members, 
    (
     SELECT count(*) 
     FROM CallToLineOfficers 
     JOIN Call USING (CallID) 
     WHERE MemberID = m.MemberID 
      AND Date BETWEEN '2017-03-21' AND '2017-03-22' 
    ) 
+ (
     SELECT count(*) 
     FROM CallToMembers 
     JOIN Call USING (CallID) 
     WHERE MemberID = m.MemberID 
      AND Date BETWEEN '2017-03-21' AND '2017-03-22' 
    ) AS Tally 
FROM Members AS m 
WHERE FirstName <> 'None' 
ORDER BY LastName ASC; 
+0

是「USING(CallID)」的另一種說法Call.CallID = CallToMembers.CallID?我以前沒見過USING。 – RockGuitarist1

+0

是的,它是一樣的(但也從結果中刪除重複的列)。 –

+0

太好了。我希望我能在8個月前瞭解到哈哈。我還從你回答我的最後一個問題中得到了你的建議,並決定子查詢在這裏最好。 – RockGuitarist1

相關問題