如何计算两个表的列值之间的差异

时间:2012-08-15 15:58:10

标签: sql ms-access

我有两个表:T_Guest,T_Table

T_Guest 中,我有一个来宾列表。每位访客都有一个ID( g_no )和与该访客相关的表格( t_no )的ID。 有可能在同一张桌子上会有很多客人。

T_Table 中,我有一个表格列表。每个表都有一个ID( t_no )和一个字段 n_places ,用于描述该表所拥有的位数。

问题: 我需要构建一个SQL查询(在MS Access中),它将显示一个表ID的列表,这些表仍然是免费的。


我有一个想法,首先找到已满的表的列表,而不仅仅是从整个可用表组中对该组实现EXCEPTION。

但是为了计算有多少个表确实有ZERO空位,我需要以某种方式为每个表计算:

n_places - NUMBER_OF_GUESTS_ON_THAT_TABLE

最后一个(NUMBER_OF_GUESTS_ON_THAT_TABLE)只是:

SELECT COUNT(*)
FROM T_Table INNER JOIN T_Guest ON T_Table.t_no = T_Guest.t_no
GROUP BY T_Table.t_no

但我不知道如何实施DIFFERENCE n_places - NUMBER_OF_GUESTS_ON_THAT_TABLE

有人可以帮助我完成这项任务吗?

3 个答案:

答案 0 :(得分:3)

您可以将来宾计数用作派生表:

SELECT t.t_no, t.n_Places-Nz(g.Guests,0) As FreePlaces
FROM T_Table t
LEFT JOIN (
    SELECT t_no,COUNT(*) as Guests
    FROM T_Guest 
    GROUP BY t_no) g
ON t.t_no = g.t_no

要获取包含空格的表格,您可以添加:

WHERE t.n_Places-Nz(g.Guests,0)>0

答案 1 :(得分:1)

SELECT [tt].[t_no]
FROM T_Table AS tt
WHERE (SELECT COUNT(*) FROM T_Guest AS tg WHERE tg.t_no = tt.t_no) < tt.n_places

应该在访问中工作,使用子查询但是在给定上下文的情况下我不认为这将是一个问题。

答案 2 :(得分:0)

这是HAVING子句的经典之作:

SELECT t_no FROM T_Guest GROUP BY t_no
HAVING COUNT(*)<(SELECT T_Table.n_Places FROM T_Table WHERE T_Table.t_no=T_Guest.t_no)