web-dev-qa-db-ja.com

ExcelテーブルでSQLクエリを実行する方法

A〜Zでソートされたすべての姓フィールドの別のテーブルからサブテーブルを作成しようとしています。これらのテーブルには、nullではない電話番号フィールドがあります。私はSQLを使ってこれを非常に簡単にすることができました、しかし、私はエクセルの中でSQL問い合わせを実行することに関してうまくいく方法の手がかりがありません。私はデータをpostgresqlにインポートし、そこでクエリを実行したいと思っていますが、それは少しやり過ぎです。

私がやろうとしていることのために、SQLクエリSELECT lastname, firstname, phonenumber WHERE phonenumber IS NOT NULL ORDER BY lastnameはうまくいくでしょう。それがExcelが本来できないことであることはあまりにも単純すぎるようです。 ExcelからこのようなSQLクエリを実行する方法を教えてください。

66
Vap0r

これを成し遂げるための多くのすばらしい方法があります、他はすでに提案しました。 「SQLトラックを介してExcelデータを取得する」に沿って、ここにいくつかのポインタがあります。

  1. Excelには「データ接続ウィザード」があり、これを使って他のデータソースからインポートしたり、あるいはまったく同じExcelファイル内でリンクすることができます。

  2. Microsoft Office(およびOS)の一部として興味を引く2つのプロバイダがあります。古い "Microsoft.Jet.OLEDB"と最新の "Microsoft.ACE.OLEDB"です。接続を設定するときにそれらを探します(データ接続ウィザードなどを使用)。

  3. Excelワークブックに接続すると、ワークシートまたは範囲はテーブルまたはビューと同等になります。ワークシートのテーブル名は、ドル記号( "$")が追加されたワークシートの名前で、角括弧( "["と "]")で囲まれています。範囲の、それは単に範囲の名前です。レコードソースとして名前の付いていないセル範囲を指定するには、角かっこ内のシート名の末尾に標準のExcel行/列表記を追加します。

  4. ネイティブSQLは(多かれ少なかれ)Microsoft AccessのSQLになります。 (以前は、JET SQLと呼ばれていましたが、Access SQLは進化してきました。JETは廃止予定の古い技術です。)

  5. 例、ワークシートを読む:SELECT * FROM [Sheet1 $]

  6. 例、範囲の読み取り:SELECT * FROM MyRange

  7. 例、名前のないセルの範囲を読み取る:SELECT * FROM [Sheet1 $ A1:B10]

  8. あなたが細目を通して働くのを助けるために利用できる多くの多くの本とウェブサイトがあります。

===さらなる注意事項===

既定では、Excelデータソースの最初の行には、フィールド名として使用できる列見出しが含まれていると想定されています。そうでない場合は、この設定をオフにする必要があります。そうしないと、データの最初の行がフィールド名として使用されるために「消えます」。これは、接続文字列のExtended PropertiesにオプションのHDR =設定を追加することによって行われます。指定する必要のないデフォルトは、HDR = Yesです。列見出しがない場合は、HDR = Noを指定する必要があります。プロバイダはあなたのフィールドにF1、F2などの名前を付けます。

ワークシートの指定に関する注意:プロバイダは、指定したワークシートの一番上、一番左、空白ではないセルからデータのテーブルが始まると想定します。つまり、データのテーブルは、問題なく3行3列目のCから始まることができます。ただし、たとえば、セルA1のデータの上および左にワークシートのタイトルを入力することはできません。

範囲の指定に関する注意:レコードソースとしてワークシートを指定すると、スペースが許す限り、プロバイダはワークシート内の既存のレコードの下に新しいレコードを追加します。範囲(名前付きまたは名前なし)を指定すると、スペースが許す限り、Jetは範囲内の既存のレコードの下に新しいレコードも追加します。ただし、元の範囲を再クエリすると、結果のレコードセットに範囲外の新しく追加されたレコードが含まれません。

CREATE TABLEのデータ型(試してみる価値があります):Short、Long、Single、Double、通貨、DateTime、Bit、Byte、GUID、BigBinary、LongBinary、VarBinary、LongText、VarChar、Decimal。

"古い技術" Excel(xls拡張子を持つファイル)への接続:Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\MyFolder\MyWorkbook.xls;Extended Properties=Excel 8.0;。 Microsoft Excel 5.0および7.0(95)ブックにはExcel 5.0ソースデータベースタイプを使用し、Microsoft Excel 8.0(97)、9.0(2000)および10.0(2002)ブックにはExcel 8.0ソースデータベースタイプを使用します。

"最新の" Excel(ファイル拡張子xlsxのファイル)に接続する:Provider=Microsoft.ACE.OLEDB.12.0;Data Source=Excel2007file.xlsx;Extended Properties="Excel 12.0 Xml;HDR=YES;"

データをテキストとして扱う:IMEX設定はすべてのデータをテキストとして扱います。プロバイダ= Microsoft.ACE.OLEDB.12.0;データソース= Excel2007file.xlsx;拡張プロパティ= "Excel 12.0 Xml; HDR = YES; IMEX = 1";

(詳細は http://www.connectionstrings.com/Excel

http://msdn.Microsoft.com/en-US/library/ms141683(v = sql.90).aspx および http://support.Microsoft)に詳細情報があります。 .com/kb/316934

http://support.Microsoft.com/kb/257819 に詳述されているVBA経由でADODB経由でExcelに接続する

Microsoft JET 4の詳細は http://support.Microsoft.com/kb/275561 にあります。

54
rskar

次のようにこれをネイティブに行うことができます。

  1. テーブルを選択し、Excelを使用して姓で並べ替えます。
  2. 2行1列の詳細フィルタ基準を作成します。たとえばE1とE2では、E1は空で、E2には式=C6=""が含まれます。ここで、C6は電話番号列の最初のデータセルです。
  3. テーブルを選択し、拡張フィルターを使用して、E1:E2の基準範囲を使用して範囲にコピーし、出力のコピー先を指定します。

あなたがプログラム的にこれをしたいならば、私はあなたが上記のステップを記録してコードを見るためにあなたがマクロレコーダーを使うことを勧めます。

8

tl; dr; Excelはこれをすべてネイティブに行います。 フィルタ または テーブルを使用します。

http://office.Microsoft.com/en-gb/Excel-help/filter-data-in-an-Excel-table-HA102840028.aspx

Oledb接続を介してプログラム的にExcelを開き、ワークシート内のテーブルに対してSQLを実行できます。

しかし、あなたはあなたがしたいと思っていることは何でもすることができます。

  1. 見ているデータ内の任意の場所をクリック
  2. リボンバーのデータに移動します
  3. 「フィルタ」を選択して、中央付近にし、じょうごのように見えます
    • テーブルの最初の行の各セルの手前に矢印が表示されます。
  4. 電話番号の矢印をクリックして、空白の選択を解除します(最後のオプション)
  5. 姓の矢印をクリックして並び順を選択します(上のオプション)

いくつか注意すべき点があります。

  1. あなたはフィルタリングされた行を選択してどこかに貼り付けることができます
  2. 左側のステータスバーには、合計行数のうち、いくつの行が自分に一致するかの基準が表示されます。 (たとえば、313のうち308のレコードが見つかりました)
  3. あなたはワード上のExcel 2010で色でフィルタリングすることができます
  4. 私は時々私はあなたがそれからあなたもフィルタをかけるかまたは論文によって分類することができるデータの状態またはきれいにされたバージョンを与える計算列を作成します。 (例えば他の答えの式のように)

あなたがそれをたくさんやろうとしているのでなければ、あるいはどこかにデータのインポートを自動化したいのであれば、フィルターを使ってそれをしてください。

C#オプション:

 OleDbConnection ExcelFile = new OleDbConnection( String.Format( "Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties=\"Excel 12.0;HDR=YES\"", filename));
 ExcelFile.Open();

あなたが思っている以上のものがあるかもしれないので、始めるのに便利な場所はスキーマを見ることです:

List<String> excelSheets = new List<string>();

// Add the sheet name to the string array.
foreach (DataRow row in dt.Rows) {
    string temp = row["TABLE_NAME"].ToString();
    if (temp[temp.Length - 1] == '$') {
         excelSheets.Add(row["TABLE_NAME"].ToString());
    }
}

それからあなたがシートを照会したいとき:

 OleDbDataAdapter da = new OleDbDataAdapter("select * from [" + sheet + "]", ExcelFile);
 dt = new DataTable();
  da.Fill(dt);

注 - Excelでテーブルを使用してください!:

Excelには、データをテーブルのように動作させる「テーブル」機能があります。これは大きな利点をもたらしますが、あらゆる種類のクエリを実行できるわけではありません。

http://office.Microsoft.com/en-gb/Excel-help/overview-of-Excel-tables-HA010048546.aspx

Excelの表形式データの場合、これが私のデフォルトです。最初にデータをクリックしてから、リボンのホームセクションから「表としてフォーマット」を選択します。これにより、デフォルトでフィルタリングやソートが可能になり、名前でテーブルやフィールドにアクセスできるようになります(例:table [fieldname])。最大と平均

5
user359135

あなたはExcelでSQLを使うことができます。隠れているだけです。このチュートリアルを参照してください。

http://smallbusiness.chron.com/use-sql-statements-ms-Excel-41193.html

3

QueryStorm 試してみることをお勧めします - それはExcelでSQLを使用することを非常に便利にするExcel用のプラグインです。

また、それはフリーミアムです。オートコンプリートやエラーの発生などを気にしないのであれば、無料で使用できます。ダウンロードしてインストールするだけで、ExcelでSQLがサポートされます。

免責事項:私は作者です。

2
anakic

一度これを行う必要がある場合はCharlesの説明に従うだけですが、フィルタを動的にしたい場合に備えてExcelの数式やヘルパー列を使用することもできます。

データがシートDataSheetにあり、次の列の2行目から始まると仮定します。

  • A:姓
  • B:名
  • 子:電話番号

このシートには2つの補助列が必要です。

  • D2:=if(A2 = "", 1, 0)、これはあなたのwhere条件に対応するフィルター列です
  • E2:=if(D2 <> 1, "", sumifs(D$2:D$1048576, A$2:A$1048576, "<"&A2) + sumifs(D$2:D2, A$2:A2, A2))、これは次の命令に対応する

データの範囲内でこれらの式をコピーしてください。

結果が表示されるはずのシート上に次の列を作成します。

  • A:2行目の1から始まる数字の並び、これはあなたが得ることができる総行数を制限します(続編の制限のようなものです)。
  • B2:=match(A2, DataSheet!$E$2:$E$1048576, 0)、これは対応するデータの行です
  • C2:=iferror(index(DataSheet!A$2:A$1048576, $B2), "")、これは実際のデータ、またはデータが存在しない場合は空です

B2とC2の式をコピーし、C列をDとEにコピーペーストします。

2
unique2

複数のExcelシートまたは複数のExcelファイルのデータを組み合わせてSQLを実行する場合は、 Rockset というクラウドサービスを使用できます。 Rocksetは、Excel、Pdf、またはtxt/xml/json/csvのデータを組み合わせることができるSQLインターフェースを提供します。

0
dhruba