0

従来の ASP Web ページのバックエンドとして Access DB を使用しています。パラメータを使用する保存済みクエリを作成しています。Access 2000 のクエリ ビルダでテストしています。フィールドはすべてテキストで、デフォルト値は NULL で、[in_b] には長さ 0 が許可されています。そのうちの 9 つは、B160、B80、B40、B30 などの名前です。

私のクエリは次のとおりです。

 SELECT COUNT([in_b]) AS BCnt FROM tblScore 
 WHERE UCALL=[in_call] and NOT ISNULL([in_b]);

これは、指定された UCALL のすべての行の数を返します。2[in_b] のいずれかを実際の列名に変更すると、クエリは必要なもの (この場合は 0) を返しますが、9 回のクエリを実行する必要があります。

テーブルの例

Call  Zone B160   B80  B40
NF4L   1    NULL   X    NULL
NF4L   6    Null  Null  NULL
NF4L   20     X     X   Null
WA4B   2    NULL  NULL   X

If in_call is NF4L and in_b is B160, I expect 1
If in_call is NF4L and in_b is B80,  I expect 2
If in_call is NF4L and in_b is B40,  I expect 0

目標は、特定の呼び出しで空でないすべての「B」列の数を取得することです。

4

2 に答える 2

0

この場合、実際のデータ値ではなく、パラメーター ([in_b]) を列への参照として使用しています。このデザインではあまり遠くに行けないと思います。

9 つの異なるクエリを作成する (やらないでください!) に加えて、次の 2 つの方法があります。

  1. テーブルのデザインをキーと値のペアに変更する
  2. 提供された条件に基づいてクエリを動的に作成します

オプション 1 では、テーブルを次のように変更できます。

Call | Zone | BField | BFieldValue
NF4L | 1    | B80    | X
NF4L | 1    | B160   | NULL
NF4L | 1    | B40    | NULL
NF4L | 6    | B160   | NULL
NF4L | 6    | B80    | NULL
NF4L | 6    | B40    | NULL
NF4L | 20   | B160   | X
NF4L | 20   | B80    | X
NF4L | 20   | B40    | NULL
...

クエリは次のようになります。

SELECT BField, COUNT([BFieldValue]) AS BCnt 
FROM tblScore 
WHERE UCALL=[in_call] and [BFieldValue] IS NOT NULL
GROUP BY BField;

このオプションは、2 つのオプションの中でより拡張性があります。ある時点で追加の「BFields」を追加する必要がある場合、それを行うのは簡単ですが、テーブルにデータを追加する方法でテーブルを再設計しなければならないという代償が伴います。

オプション 2 は、実行時にクエリを動的に構築することで、概説した条件に基づいて実際の列名を置き換えることができます。例えば:

Dim SQL as String
Dim BField as String
Dim InCall as String

'These would typically be passed in, not hardcoded as they are here
Set InCall = "NF4L"
Set BField = "B160"

SET SQL = "SELECT Count([" & BField & "] FROM tblScore WHERE [Call] ='" & InCall & "' AND NOT ISNULL([" & BField & "]);"

'From here, either open up a recordset based on this SQL or create a new QueryDef object and execute it.
于 2013-01-31T14:00:26.397 に答える
0

私はSQL Serverを使用していることを知っています。パラメーターを渡してCASE、次のようなステートメントを使用できます。

SELECT COUNT(*) 
FROM Test
WHERE CASE 
   WHEN @col = 'col1'
   THEN col1 
   WHEN @col = 'col2' 
   THEN col2 END IS NOT NULL

@col は、渡されたパラメーターです。MS Access でこれを実行できると思いますIIF-- 試してみてください:

SELECT COUNT(*) 
FROM Test
WHERE NOT ISNULL(IIF(@col = 'col1', col1, IIF(@col = 'col2', col2, ...))

または、動的 SQL を使用してこのサーバー側を実行することもできますが、パラメーター化されたクエリを使用するようにしてください。良い例を次に示します。

Const ad_nVarChar = 202
Const ad_ParamInput = 1

strSQL = "SELECT Count(*) FROM tblScore WHERE [Call] = ? AND NOT ISNULL(?); "

Set cmd = Server.CreateObject("ADODB.Command")    
cmd.ActiveConnection = connStr
cmd.CommandText = strSQL
cmd.CommandType = adCmdText
cmd.Parameters(0) = "NF4L"
cmd.Parameters(1) = "B160"

Set rst = cmd.Execute()

幸運を。

于 2013-01-31T14:12:32.713 に答える