web-dev-qa-db-ja.com

ExcelでSQL Serverからインポートする前にデータを動的にフィルタリングする

Excelにインポートする前に、SQL Server接続からデータをフィルターする方法があるかどうかを確認しようとしています。最初のインポートは関係ありません(接続がセットアップされている場合)が、後で開いたときにデータがほとんどまたはまったくなく、パラメーターが選択された後にのみ関連データをインポートする必要があるExcelが必要です。 SQLテーブルには大量のデータが含まれる可能性があり、パフォーマンスが問題になります。

したがって、データをテーブルにインポートする場合、たとえば、Country to be UKにフィルターを適用し、ファイルを閉じて、来週再び開きます。理想的には、クエリを実行してUKのデータのみをインポートする必要があります。また、別の国を選択すると、その国のみのデータがインポートされます。選択肢を表から列挙する必要があります。

現在、テーブルにその機能があるとは思えません。しかし、スライサー、ピボットテーブル、PowerView、PowerPivotはどうでしょうか。

どんなアイデアにも感謝します。

7
Griffin

Tables、Powerpivot、Data Explorerでこれを完全に行うことができます。現在のところ、最も簡単で好ましい方法は、パラメーター化されたクエリをExcelで作成することです。これを行うには、Query Wizardを使用し、最後に、渡すパラメーターごとに制約を追加します。これが完了したら、接続プロパティを編集して、返されるパラメーターを静的な値、ダイアログボックス、またはスプレッドシートのセル。

  1. MSクエリを使用してデータソースを選択します。これは、パラメーターをSQLに戻すために必要です。 Data>Other Sources>Microsoft Query
  2. Data Sourceを選択し、ここでSQLデータソースを選択します。通常、Finishウィンドウが表示されるまで、これらのオプションはすべて空白のままにし、次にView data or edit query in MS Query. を選択します。
    • 注:通常、必要な情報をSQLからここに接続できる単一のビューに前処理しますが、通常は任意の選択ステートメントを渡すことができます。ストアドプロシージャを呼び出したことがないので、それがどのように機能するかわかりません
  3. MSクエリウィンドウで、Show/Hide Criteria buttonをクリックし、[基準]フィールドを選択します。これは、SQLに戻すためにパラメーターを呼び出すものになります。
    • 例:日付フィールドがあり、それを[基準]フィールドで選択した場合、[開始]と[終了]の間の値を追加します。これによりパラメータが作成され、MS Queryは両方の値を入力して、適切なデータセットをすぐに返すように要求します。作成したSQLステートメントを確認すると、WHERE(datasource.date Between?and?)句が追加されています。
  4. [ファイル]> [データをExcelに返す]を選択し、[テーブルを選択]を選択します。
  5. テーブルでクエリパラメータを自動的に取得するには、テーブルのセルを選択し、[データ]> [プロパティ]> [接続プロパティ]> [定義]> [パラメータ]に移動します。
  6. パラメータごとに、を選択できます。
    1. 値を入力するように要求します。または
    2. 特定の値を使用します。または
    3. スプレッドシートのセルから値を取得します。セルの値が変更されるたびにテーブルデータを自動的に更新するオプションがあります。
      • 追加オプションとして、パラメーターとして選択したセルでデータ検証を使用して、選択可能な値を制限することができます。データベースの値から供給されるテーブルから検証セルを取得することもでき、データベースに保持されている値のみを選択できるようにします。
  7. 各パラメーターのパラメーター値を設定し、すべてのダイアログボックスで[OK]をクリックします。
  8. 最後に、ファイルサイズを最小化するために、[接続プロパティ]> [使用法]タブで、[ファイルを開くときにデータを更新]を選択し、ワークブックを保存する前に外部範囲からデータを削除します。これにより、ファイルがアクティブに使用されていないときに接続データがダンプされ、ファイルサイズが最小化されます。

多くの場合、パラメーター化されたクエリからフィードされたテーブルに基づいてピボットテーブルを作成し、自動的に更新される特定の日付範囲(6か月前など)の値を返します。

編集: SQL IN句で使用する複数の値を返すには、MSクエリボックスの[条件]ウィンドウを変更するだけです。たとえば、国のフィールド名がある場合、それを[基準フィールド]で選択し、[値]にIN([First]、[Second]、[Third])と入力します。 Excelにデータを返すを選択すると、MSクエリが手動で値を入力するように求めます。 Excelに戻ったら、パラメーターを再度変更し、スプレッドシート内の3つのセルを指すようにできます。それぞれのセルは、データの検証によって制約されます。このように渡すことができるパラメーターの数にはおそらく制限がありますが、Excelでは3つを簡単に処理できるため、他にいくつか問題がないとは限りません。

8
dav

VBAを使用してもかまわない場合は、SQLクエリを動的に生成することでこれを簡単に行うことができます。

QlikViewやCrystalほど複雑なものを必要としないアドホックダッシュボードを生成するために、以下のようなものをかなり広範囲に使用しています

例えば。

非表示のシート「変数」には、テーブル「Table_SQL_SALES_EMPLOYEES」が含まれています。これはSQLによって入力され、パラメーターの選択に必要な最小値を返すだけです。 _SELECT DISTINCT AccountDirector FROM InvoicedSales ORDER BY AccountDirector_のようなもの。

次に、名前付き範囲 'Sales_Employees'があり、その範囲は_=Table_SQL_SALES_EMPLOYEES[AccountDirector]_として参照しています。これは、入力範囲が「Sales_Employees」に設定されているコンボボックスにマップされます。これにより、選択したリスト内のアイテムの選択したセル(私の場合はE5)に番号が送信されます。元のSQL抽出に従って実際の値を返すには、=OFFSET(Table_SQL_SALES_EMPLOYEES[[#Headers],[AccountDirector]],$E$5,0)を使用する必要があります。これは「Slp」という名前です。

。:可能なすべてのアカウントディレクターのドロップダウン選択ボックスがあります。会計四半期にはもう1つありますが、同じ原則です。

コンボボックスで選択が変更されると、マクロ 'changeFilter()'が呼び出されます。

_Sub changeFilter()
    Dim wb As Workbook
    Set wb = Excel.ActiveWorkbook
    Dim ws As Worksheet
    Set ws = Excel.ActiveWorkbook.Sheets("Lookups")
    Dim conn As Excel.WorkbookConnection
    Dim slp As Name
    Set slp = wb.Names("Slp")
    Dim qtr As Integer
    qtr = wb.Names("qtr").RefersToRange.Value2
    Dim query As String

    ' Adjusted Sales Consolidated
    Set conn = wb.Connections("SQL_ADJUSTEDSALES_CONSOLIDATED")
    query = "SELECT * FROM InvoicedSales WHERE AccountDirector=" & "'" & slp.RefersToRange.Value2 & "'"
    conn.OLEDBConnection.CommandText = query
    conn.Refresh
_

ハードコーディングされた変数を使用してデータベースに接続することにより、テーブル/ピボットを基本的に事前設定し、「ファイルを開くときにデータを更新する」オプションと「ワークブックを保存する前に外部データ範囲からデータを削除する」オプションを選択します-これにより、ファイルサイズを小さく保つことができます実際には何も保存されません。

フィルターを変更すると、ハードコードされた変数が、選択したパラメーターを使用して動的に生成されたSQLクエリで上書きされ、テーブルが更新されます。

1
James