2

对于给定时间段(包括两个给定日期),例如 2002 年 12 月 1 日至 2003 年 7 月 31 日,找到在指定时间段内至少拥有一张 EZ 链接卡的人的集合。对于集合中的每个人,请列出 (i) 所有者身份证,(ii) 他/她在此期间发行的卡的总数,以及 (iii) 已更换卡的总数(截至当前日期)仅在给定期间发行的那些卡的所有者。按所有者身份证的升序列出您的结果。

create table card
(
CardID  int not null primary key,
OwnerNRIC   char(9),
IssuedDcardate  date,
StoredValue decimal (5,2),
OldCardID   int,
constraint card_fk foreign key (OldCardID) references card(CardID)
);

如上是我的牌桌。

这是我的尝试,但我很迷茫。

 Select distinct(ownerNRIC) as NRIC,count(*) as Total Crads Issued during Period
From card
Where issuedDate between ‘2002-12-01’ and ‘2003-7-31’ group by ownerNRIC;
4

1 回答 1

1

我假设换卡会导致非空 OldCardId。如果 OldCardId 为 NULL,那么这不是换卡。利用 COUNT( expr ) 忽略expr为 NULL 的行的方式。

SELECT ownerNRIC AS NRIC, 
  COUNT(*) AS `Total Cards Issued During Period`,
  COUNT(OldCardID) AS `Card Replacements During Period`
FROM card
WHERE issuedDate BETWEEN '2002-12-01' AND '2003-7-31' 
GROUP BY ownerNRIC;

您错误地使用了 DISTINCT。这不是一个函数,而且无论如何都没有必要,因为 ownerNRIC 是您的 GROUP BY 列。

所有者仅对在给定期间发行的卡进行的换卡总数(截至当前日期)

这个要求不明确。您的意思是旧卡是在给定期间发行的,而新卡是在当前日期之前的任何时间发行的吗?如果是这样,上面的查询不会给你那个。

于 2013-03-21T14:54:16.113 回答