2016-09-30 37 views
0

クライアント情報を持つAccess 2010データベースがあります。私は各年齢のクライアントの数のテーブルを作成する必要があります。私が報告している代理店は、0歳から100歳までのすべての年齢層の顧客数が記載されたレポートを希望しています。以下のSQLクエリは必要なレポートを作成しますが、クライアントがゼロの年齢は含まれません。Accessクエリの結果に空の行を含める方法

SELECT AgeNum & " years" AS [Age], Count(*) AS [Count] 
FROM (SELECT Int(DateDiff("d", Clients.dob, now())/365.25) AS AgeNum 
FROM Clients) AS [%$##@_Alias] 
GROUP BY [%$##@_Alias].AgeNum; 

[カウント]列に0の空の行が返されるようにするにはどうすればよいですか?

私は周りを見回し、これを発見したが:

How can I create a row for values that don't exist and fill the count with 0 values?

彼らは、空のグループを検索する値の表を作成します。

Nz([Age],0) 

そして、はい、あなたのリンクはのために働く必要があります:それはあなたの代わりにCOALESCENz機能を使用することができます

+0

'%$ ## @ _エイリアス'面白い名前の選択! – onedaywhen

答えて

0

システムのみ特定のレコードが存在する場合、年齢があることを知っています。あなたが1..100の間の年齢のリストを持っている場合は、あなたは0..100歳を探しているシステムを教えたり提供したりする必要があります。あなたが探している年齢のリストを提供することによって、要求された年齢が検索されたレコードで見つからない場合、システムは自動的に0/nullを返します。

他にも言及しているように、1..100という行を持つテーブルをSQLで比較したり、SQLで数値のリストを生成することができます。

一部のDBMSでは、1つの列と1つの行を持つdualというデフォルトの表が用意されています。この表は、from表を持たない問合せに使用できます。 アクセスアプリケーションでテーブルを作成して "dual"とし、1行を挿入します

今、このクエリを実行します。

SELECT TMain.counter 
FROM (SELECT (T2.mAge*t3.mFactor10)+t1.mAge AS counter 
FROM (select 1 as mAge from dual 
union all select 2 from dual 
union all select 3 from dual 
union all select 4 from dual 
union all select 5 from dual 
union all select 6 from dual 
union all select 7 from dual 
union all select 8 from dual 
union all select 9 from dual 
union all select 10 from dual) AS T1, 
(select 0 as mAge from dual 
union all select 1 from dual 
union all select 2 from dual 
union all select 3 from dual 
union all select 4 from dual 
union all select 5 from dual 
union all select 6 from dual 
union all select 7 from dual 
union all select 8 from dual 
union all select 9 from dual 
union all select 10 from dual) AS T2, 
(select 10 as mFactor10 from dual) AS T3) AS TMain 
WHERE (((TMain.counter) Between 1 And 100)); 

が、これは1 100から100行が生成されます。

この結果をSQLの外部表として使用して、このリストにある年齢のユーザーを検索/カウントすることができます。 ロジックは次のようになります。SQLで

select all age 
from the reqeusted age list 
find and count/return all matched records or return 0 if no records found. 

、それはこのようなものになるだろう、

SELECT TMain.counter as Age, 
(SELECT Count(*) AS [Count] 
FROM (SELECT Int(DateDiff("d", Clients.dob, now())/365.25) AS AgeNum 
FROM Clients) AS [%$##@_Alias] 
WHERE (TMain.counter = [%$##@_Alias].ageNum) 
GROUP BY [%$##@_Alias].AgeNum) as number_of_clients 
FROM (SELECT (T2.mAge*t3.mFactor10)+t1.mAge AS counter 
FROM (select 1 as mAge from dual 
union all select 2 from dual 
union all select 3 from dual 
union all select 4 from dual 
union all select 5 from dual 
union all select 6 from dual 
union all select 7 from dual 
union all select 8 from dual 
union all select 9 from dual 
union all select 10 from dual) AS T1, 
(select 0 as mAge from dual 
union all select 1 from dual 
union all select 2 from dual 
union all select 3 from dual 
union all select 4 from dual 
union all select 5 from dual 
union all select 6 from dual 
union all select 7 from dual 
union all select 8 from dual 
union all select 9 from dual 
union all select 10 from dual) AS T2, 
(select 10 as mFactor10 from dual) AS T3) AS TMain 
WHERE (((TMain.counter) Between 1 And 100)); 

これが生成されます。クライアントの1..100から年齢だけでなく、多数の各年齢のためにとnullの場合はnull、空の場合は空です。 もちろん、年齢リストを動的に延長または短縮することができます。

+0

これはうまくいきました。しかし、すべての空行に対してゼロを追加する必要があります。 Sergey SはNz関数を示唆した。私はこの行にそれを追加しようとしました: –

+0

だけサブクエリ全体をカプセル化.. nz((select count(.....)、0)ageNum @BeakerMcChemist –

+0

これはうまくいきました。 @ Sergey-Sと@onedaywhenがNz関数を提案したので、この行に追加してみました: 'GROUP BY [Alias] .AgeNum)as number_of_clients' number_of_clientsとして 'GROUP BY Nz([Alias] .AgeNum、0))に変更しましたが、動作しませんでした。クエリはAccessによって生成されたレポートにフィードされます。これはAccessを初めて使用するときです。私は「コンピュータを知っている」が、私は頭が狂っているので、私はこれを行うことに決めました。 –

0

アクセス2010でサポートされていないCOALESCE関数を使用する以外は、私は必要なものと非常によく似ています君は。

+1

TCは、彼はAccessで働いており、彼は質問が必要だと言った。 AccessクエリでサポートされているNz関数 –

+0

「AccessクエリでサポートされているNz関数」 - 厳密には正しくありません:AccessクエリでNz式(厳密にはクエリで使用される関数ではありません)彼らは、「Access 2010データベース」を使用して「必要なレポート」を暗示しているが、アクセスUIを使用していることを明示していないという。あなたはおそらく正しく仮定します:) – onedaywhen

0

可能なすべての整数のシーケンス表を作成します(英国の医療データ辞書のFYIで年齢の最大年齢は220です)。この表に「アンチ・ジョイン」します。元の結果を表示することができます。

次のSQL DDLは、ANSI-92クエリモードを必要とする(デフォルトクエリモードよりもSQL Serverのコーダのための、おそらくより良い)だけでなく、アクセスGUIツールを使用してmaually作成することができます。

CREATE TABLE Seq (seq INT NOT NULL UNIQUE); 


INSERT INTO Seq VALUES (1); 
INSERT INTO Seq VALUES (2); 
INSERT INTO Seq VALUES (3); 
... 
(you can use Excel to create this script!) 
... 
INSERT INTO Seq VALUES (100); 


CREATE VIEW ClientAgeTallies (AgeInYears, Tally) 
AS 
SELECT dt.AgeInYears, COUNT(*) AS Tally 
    FROM (SELECT INT(DATEDIFF('d', c.dob, NOW())/365.25) AS AgeInYears 
      FROM Clients AS c) AS dt 
GROUP 
    BY dt.AgeInYears; 


SELECT AgeInYears, Tally 
    FROM ClientAgeTallies 
UNION 
SELECT seq AS AgeInYears, 0 AS Tally 
    FROM Seq 
WHERE seq NOT IN (SELECT AgeInYears FROM ClientAgeTallies); 
関連する問題