2017-04-06 61 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

相关问题