2016-11-29 18 views
0

要件:StartDate、EndDate、およびUpper Data Thresholdのユーザー入力に応じて、電話番号に基づいてデータを出力するクエリを生成します。SQL MS Accessクエリの除外条件

これらの入力変数は、クエリの境界です。したがって、SELECTステートメントはそれに応じて以下に記述されました。

唯一の注意点は、電話番号が上限データしきい値を超える単一のレコードを持つ場合、その違反電話番号に関連付けられたすべての電話番号レコードは、同じ電話番号の他のレコードとは無関係に出力されるべきではないデータのしきい値に違反していません。以下のサンプル入力と期待出力されます:

User input Start Date: 1/15/2015 
User input End Date: 11/15/2015 
User input Upper Data Threshold in kB: 50 

[Master] Table in Access: 
Invc Date Mobile Nbr  PktDtVol 
--------- ----------  -------- 
1/15/15 647-409-8206 48kB 
2/15/15 647-409-8206 33kB 
3/15/15 647-409-8206 8000kB 
4/15/15 647-409-8206 20kB 
5/15/15 647-409-8206 10kB 
6/15/15 647-409-8206 0kB 
7/15/15 718-500-2311 3kB 
8/15/15 718-500-2311 45kB 
9/15/15 718-500-2311 25kB 
10/15/15 514-300-3311 33kB 
11/15/15 514-300-3311 20kB 
[TEMP_TABLE]で出力期待

Invc Date Mobile Nbr  PktDtVol Difference in Days 
--------- ----------  -------- ------------------- 
7/15/15 718-500-2311 3kB    304 
8/15/15 718-500-2311 45kB   304 
9/15/15 718-500-2311 25kB   304 
10/15/15 514-300-3311 33kB   304 
11/15/15 514-300-3311 20kB   304 

私の現在のソリューション:

PARAMETERS [Start Date] DateTime, [End Date] DateTime, [Upper Bound 
Usage in KB] IEEEDouble; 

SELECT [Master].[Invc Date], [Master].PktDtVol, [Master].[Mobile Nbr], 
DateDiff("d",[Start Date],[End Date]) AS [Difference in days] INTO 
Temp_Table 
FROM [Master] 
WHERE ((([Master].[Invc Date]) >= [Start Date] And 
     ([Master].[Invc Date])<=[End Date]) AND 
     (([Master].PktDtVol)<= [Upper Bound Usage in KB])); 

647-409-8206レコードが期待されていません出力では50kB(3番目のレコード)を超えるレコードが1つしかなかったので、ALL 647-409-8206レコードはそれに応じて省略されます。

ありがとうございました!ありがとう!

+0

実際の電話番号のように見え、実際の電話番号と同じように見えます。かなりの人とこれを共有してもよろしいですか? – Fionnuala

+0

彼らは確かに偽の数字です、私はそれに応じてデータを修正しました - しかし、ありがとう! – stitch70

+0

また、いくつかの設計ミスがあるようです。 – Fionnuala

答えて

1

行がしきい値に違反しているすべての(個別の)モバイル番号を選択するサブクエリを最初に書き出します。その後、テーブルからすべての行WHERE [Mobile Nbr] NOT IN (subquery)を選択します。

+0

両方の答えが助けられました!私が使用した正確なSELECT文は次のとおりです。パラメータ[開始日] DateTime、[終了日] DateTime、[上限使用量(KB)] IEEEDouble; SELECT m。[Invc Date]、m.PktDtVol、m。[Mobile Nbr]、DateDiff( "d"、[開始日]、[終了日])AS [日数差] INTO Temp_Table マスターASから [Invc Date]> = [開始日])<= [終了日] AND m。[モバイルNbr] NOT IN (選択q。[モバイルNbr] からマスターAS q WHERE(q.PktDtVol> = [上限バウンド使用量(KB)])); – stitch70

+0

これをフォローアップするには、これを最適化する方法がありますか?私は100,000を超えるレコードを処理していますが、クエリは現在非常に時間がかかります(ぶら下がりに近づく) – stitch70

+0

データベースシステムに少し依存する - 私はmsアクセスで動作しない傾向があります。 Postgres、SQL Server、Oracle、またはSQLiteを軽量アプリケーションに推奨したい)が、私はMS Accessがサブクエリをうまく処理しないと想像することができます。したがって、サブクエリで 'LEFT OUTER JOIN'を試して、サブクエリキーが' IS NULL 'であることを保証する 'WHERE'節を追加することができます。基本的に 'SELECT ... FROMテーブルLEFT OUTER JOIN(サブクエリ)s ON ... WHERE [Mobile Nr]はNULLです。これにより、サブクエリが一度だけ評価されるようにする必要があります。 –

1

これはかなり荒いものであり、デザインはうまくいく必要がありますが、それはあなたにスタートを与えるはずです。

PARAMETERS [Start Date] DATETIME, [End Date] DATETIME, [Upper Bound Usage in KB] 
IEEEDOUBLE; 

SELECT m.[invc date], 
     m.[mobile nbr], 
     m.[pktdtvol], 
     Datediff("d", [start date], [end date]) AS [Difference in days] 
INTO temp_table 
FROM master AS m 
WHERE m.[invc date] >= [start date] 
     AND m.[invc date] <= [end date] 
     AND m.[mobile nbr] NOT IN 
      (SELECT q.[mobile nbr] 
      FROM master q 
      WHERE q.pktdtvol >= [upper bound usage in kb]) 
+0

残念ながら、私のレコードセットは60,000を超えるレコードであるため、残念ながらこれは機能しません。私はINDEXINGを使用しようとしていますが、これまでは機能していませんでした。別の解決方法がありますか、またはおそらくINDEXINGが正しく使用されていませんか?私は "CREATE INDEX"を使ってインデックスを作成しました。 – stitch70