2

2002 年 12 月 1 日から 2003 年 7 月 31 日までの特定の期間 (2 つの特定の日付を含む) について、特定の期間内に発行された EZ リンク カードを少なくとも 1 枚持っている人々のセットを見つけます。セット内の各人物について、(i) 所有者 NRIC、(ii) 期間中に発行された彼/彼女のカードの総数、および (iii) によって行われたカード交換の総数 (現在の日付まで) をリストします。特定の期間中に発行されたカードのみの所有者。結果を所有者 NRIC の昇順にリストします。

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 が null 以外になると想定しています。OldCardId が NULL の場合、これはカードの交換ではありません。exprが NULLである行を COUNT( expr ) が無視する方法を利用します。

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 に答える