2009-07-30 6 views
3

特定のアイテムがデータベースに保存されている時間を追跡するレポートがあり、それを一連の年齢層(20-44,45-60 、61~90,91~180,180 +)。クエリーを作成するCount()は空ではなく0を返します

SELECT DISTINCT Source.ItemName, 
Count(SELECT Source.DateAdded FROM Source WHERE Int(Date()-Source.DateAdded) > 20) AS Total, 
Count(SELECT Source.DateAdded FROM Source WHERE Int(Date()-Source.DateAdded) BETWEEN 20 AND 44) AS BTWN_20_44, 
Count(SELECT Source.DateAdded FROM Source WHERE Int(Date()-Source.DateAdded) BETWEEN 45 AND 60) AS BTWN_45_60, 
Count(SELECT Source.DateAdded FROM Source WHERE Int(Date()-Source.DateAdded) BETWEEN 61 AND 90) AS BTWN_61_90, 
Count(SELECT Source.DateAdded FROM Source WHERE Int(Date()-Source.DateAdded) BETWEEN 91 AND 180) AS BTWN_91_180, 
Count(SELECT Source.DateAdded FROM Source WHERE Int(Date()-Source.DateAdded) > 180) AS GT_180 
FROM Source 
GROUP BY Source.ItemName; 

このクエリは、列のすべてのエントリがない場合を除いて、素晴らしい作品:私は、レポートのデータソースとして次のクエリを持っています。 0のカウントを返す代わりに、空の値が返されます。

空ではなく0を返すにはどうすればよいですか?

+0

今のところ削除されたコメントは、私に正しいアイデアを与えました... –

+0

Nzは通常Accessでよく動作します:Nz(文、値がNULLの場合) – Fionnuala

+0

元のクエリを試すと、「このサブクエリで最大1つのレコードを返すことができます」 – BIBD

答えて

0

私は、ネストされたIif秒のファンではないんだけど、彼らの周りのどのような方法がありますように、それはDateDiffBETWEEN...ANDいるので、見ていない

Sum(Iif(DateDiff("d",DateAdded,Date())>=91,Iif(DateDiff("d",DateAdded,Date())<=180,'1','0'),'0')) AS BTWN_91_180, 

Count文を交換してくださいうまくいきませんでした。

日付を追加しないでItemNameをプルーニングするには、クエリフィールド内で計算フィールドをチェックすることができないため、クエリブロックを大きなクエリで囲む必要がありました。最終結果は、このクエリです:

SELECT * 
FROM 
    (
    SELECT DISTINCT Source.ItemName AS InvestmentManager, 
    Sum(Iif(DateDiff("d",DateAdded,Date())>=20,Iif(DateDiff("d",DateAdded,Date())<=44,'1','0'),'0')) AS BTWN_20_44, 
    Sum(Iif(DateDiff("d",DateAdded,Date())>=45,Iif(DateDiff("d",DateAdded,Date())<=60,'1','0'),'0')) AS BTWN_45_60, 
    Sum(Iif(DateDiff("d",DateAdded,Date())>=61,Iif(DateDiff("d",DateAdded,Date())<=90,'1','0'),'0')) AS BTWN_61_90, 
    Sum(Iif(DateDiff("d",DateAdded,Date())>=91,Iif(DateDiff("d",DateAdded,Date())<=180,'1','0'),'0')) AS BTWN_91_180, 
    Sum(Iif(DateDiff("d",DateAdded,Date())>180,'1','0')) AS GT_180, 
    Sum(Iif(DateDiff("d",DateAdded,Date())>=20,'1','0')) AS Total 
    FROM Source 
    WHERE CompleteState='FAILED' 
    GROUP BY ItemName 
    ) 
WHERE Total > 0; 
+0

Nz()、なぜ2つではなく各列の1つの関数を呼び出すのですか? –

+0

'Nz'はSQL文字列を適切に受け入れず、誤った数の引数について不平を言います。 –

9

あなたは

ISNULL(Count(......), 0) 

を返すことができ、すべてがうまくいくはず - MS SQL Serverでだろう - しかし、私はちょうどあなたがアクセスを使用していました。私はAccessを十分に知らないので、これがうまくいくかどうかはわかりません - 試してみてください。

OK - Accessに似たものがあることを嬉しく思います(SQL Serverとまったく同じでない場合もあります)。

マルク・

1

さらに良いことに、例えばNz()を使用します

Nz(Count(SELECT Source.DateAdded 
      FROM Source 
      WHERE Int(Date()-Source.DateAdded), 0) 

結果がNULLの場合は0を返し、それ以外の場合は0を返します。

注:Nz()関数は、Accessオブジェクトモデルの一部であり、したがって、Accessユーザーインターフェイス内で使用される場合にのみ使用可能です。アクセスUIなしでAccessデータベースエンジンを使用している場合(OLE DB、ODBCなどの別のアプリケーションから)、「未定義関数 'Nz'式」というエラーが発生します。 (詳しくはなし)しかし第二に

+0

私はこの行でそれを試しました: 'Nz(Count(" SELECT Source.DateAdded FROM Source WHERE Int(Date() - Source.DateAdded)BETWEEN 20 AND 44 ")、0)AS BTWN_20_44'それぞれが "1"を返します。 –

+0

select文の前後で引用符( '"')を削除してみてください – BIBD

+0

引用符を削除すると、「クエリ式 ''で関数に使用されている引数の数が間違っています。 –

1

私はあなたが非常に間違ってこのクエリをやっていると思う....

私が言ったように、私はあなたの元のクエリをしようとすると、私はエラーを取得する「最大で1つのレコードにすることができこのサブクエリによって返されました "。

これはおそらく、あなたはそれが少しtrickyierだその場合、項目名あたりのカウント数を...取得しようとしている場合を除き、あなたが

SELECT DISTINCT Source.ItemName, 
    (SELECT count(Source.DateAdded) FROM Source 
     WHERE Int(Date()-Source.DateAdded)> 20) AS Total, 
    (SELECT count(Source.DateAdded) FROM Source 
     WHERE Int(Date()-Source.DateAdded) BETWEEN 20 AND 44) AS BTWN_20_44, 
    (SELECT count(Source.DateAdded) FROM Source 
     WHERE Int(Date()-Source.DateAdded) BETWEEN 45 AND 60) AS BTWN_45_60, 
    (SELECT count(Source.DateAdded) FROM Source 
     WHERE Int(Date()-Source.DateAdded) BETWEEN 61 AND 90) AS BTWN_61_90, 
    (SELECT count(Source.DateAdded) FROM Source 
     WHERE Int(Date()-Source.DateAdded) BETWEEN 91 AND 180) AS BTWN_91_180, 
    (SELECT count(Source.DateAdded) FROM Source 
     WHERE Int(Date()-Source.DateAdded) > 180) AS GT_180 
FROM Source 
GROUP BY Source.ItemName; 

を望むものに少し近いです。

+0

アイテム名ごとにカウントを取得しようとしていますが、その場合は最新のクエリがうまく機能しますが、月曜日に仕事に戻るときにバージョンを試してみます。 –

関連する問題