Wie führe ich eine SQL-Abfrage für eine Excel-Tabelle aus?

83

Ich versuche, eine Untertabelle aus einer anderen Tabelle aller nach AZ sortierten Nachnamenfelder zu erstellen, deren Telefonnummernfeld nicht null ist. Ich könnte dies mit SQL ziemlich einfach machen, aber ich habe keine Ahnung, wie ich eine SQL-Abfrage in Excel ausführen soll. Ich bin versucht, die Daten in postgresql zu importieren und dort einfach abzufragen, aber das scheint etwas übertrieben.

Für das, was ich versuche, würde die SQL-Abfrage SELECT lastname, firstname, phonenumber WHERE phonenumber IS NOT NULL ORDER BY lastnameden Trick tun. Es scheint zu einfach, als dass es etwas wäre, was Excel nicht nativ tun kann. Wie kann ich eine solche SQL-Abfrage in Excel ausführen?

Vap0r
quelle
Möchten Sie dies in SQL selbst oder in einer Anwendung tun?
John Bingham
2
Ich habe dies ziemlich gründlich untersucht und Ergebnisse auf exceldevelopmentplatform.blogspot.com/2018/10/…
S Meaden

Antworten:

70

Es gibt viele gute Möglichkeiten, dies zu erreichen, die andere bereits vorgeschlagen haben. Im Folgenden finden Sie einige Hinweise, die dem Abschnitt "Excel-Daten über SQL-Track abrufen" folgen.

  1. Excel verfügt über den "Datenverbindungsassistenten", mit dem Sie aus einer anderen Datenquelle oder sogar aus derselben Excel-Datei importieren oder verknüpfen können.

  2. Als Teil von Microsoft Office (und Betriebssystemen) sind zwei Anbieter von Interesse: der alte "Microsoft.Jet.OLEDB" und der neueste "Microsoft.ACE.OLEDB". Suchen Sie beim Einrichten einer Verbindung nach ihnen (z. B. mit dem Datenverbindungsassistenten).

  3. Sobald eine Verbindung zu einer Excel-Arbeitsmappe hergestellt wurde, entspricht ein Arbeitsblatt oder Bereich einer Tabelle oder Ansicht. Der Tabellenname eines Arbeitsblatts ist der Name des Arbeitsblatts, an das ein Dollarzeichen ("$") angehängt und mit eckigen Klammern ("[" und "]") umgeben ist. eines Bereichs ist es einfach der Name des Bereichs. Um einen unbenannten Zellenbereich als Datensatzquelle anzugeben, hängen Sie die Standard-Excel-Zeilen- / Spaltennotation an das Ende des Blattnamens in eckigen Klammern an.

  4. Das native SQL ist (mehr oder weniger) das SQL von Microsoft Access. (In der Vergangenheit hieß es JET SQL. Access SQL hat sich jedoch weiterentwickelt, und ich glaube, JET ist veraltete alte Technologie.)

  5. Beispiel: Lesen eines Arbeitsblatts: SELECT * FROM [Sheet1$]

  6. Beispiel: Lesen eines Bereichs: SELECT * FROM MyRange

  7. Beispiel: Lesen eines unbenannten Zellbereichs: SELECT * FROM [Sheet1$A1:B10]

  8. Es gibt viele, viele Bücher und Websites, die Ihnen bei der Bearbeitung der Einzelheiten helfen.

=== Weitere Hinweise ===

Standardmäßig wird davon ausgegangen, dass die erste Zeile Ihrer Excel-Datenquelle Spaltenüberschriften enthält, die als Feldnamen verwendet werden können. Ist dies nicht der Fall, müssen Sie diese Einstellung deaktivieren, oder Ihre erste Datenzeile "verschwindet", um als Feldnamen verwendet zu werden. Dies erfolgt durch Hinzufügen des optionalen HDR= settingzu den erweiterten Eigenschaften der Verbindungszeichenfolge. Der Standardwert, der nicht angegeben werden muss, ist HDR=Yes. Wenn Sie keine Spaltenüberschriften haben, müssen Sie angeben HDR=No; Der Anbieter nennt Ihre Felder F1, F2 usw.

Vorsicht beim Angeben von Arbeitsblättern: Der Anbieter geht davon aus, dass Ihre Datentabelle mit der nicht leeren Zelle ganz oben, ganz links im angegebenen Arbeitsblatt beginnt. Mit anderen Worten, Ihre Datentabelle kann problemlos in Zeile 3, Spalte C beginnen. Sie können jedoch beispielsweise keinen Arbeitsblatttitel über und links von den Daten in Zelle A1 eingeben.

Vorsicht beim Festlegen von Bereichen: Wenn Sie ein Arbeitsblatt als Datensatzquelle angeben, fügt der Anbieter neue Datensätze unter den vorhandenen Datensätzen im Arbeitsblatt hinzu, sofern der Platz dies zulässt. Wenn Sie einen Bereich (benannt oder unbenannt) angeben, fügt Jet auch neue Datensätze unter den vorhandenen Datensätzen im Bereich hinzu, sofern der Platz dies zulässt. Wenn Sie jedoch den ursprünglichen Bereich anfordern, enthält das resultierende Recordset nicht die neu hinzugefügten Datensätze außerhalb des Bereichs.

Datentypen (ein Versuch wert) für C REATE TABLE: Short, Long, Single, Double, Currency, DateTime, Bit, Byte, GUID, BigBinary, LongBinary, VarBinary, LongText, VarChar, Decimal.

Verbindung zu "old tech" Excel herstellen (Dateien mit der Erweiterung xls) : Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\MyFolder\MyWorkbook.xls;Extended Properties=Excel 8.0;. Verwenden Sie den Excel 5.0-Quelldatenbanktyp für Microsoft Excel 5.0- und 7.0 (95) -Arbeitsmappen und den Excel 8.0-Quelldatenbanktyp für Microsoft Excel 8.0- (97), 9.0- (2000) und 10.0- (2002) -Arbeitsmappen.

Herstellen einer Verbindung zu "neuestem" Excel (Dateien mit der Dateierweiterung xlsx): Provider=Microsoft.ACE.OLEDB.12.0;Data Source=Excel2007file.xlsx;Extended Properties="Excel 12.0 Xml;HDR=YES;"

Daten als Text behandeln: Die IMEX-Einstellung behandelt alle Daten als Text. Provider=Microsoft.ACE.OLEDB.12.0;Data Source=Excel2007file.xlsx;Extended Properties="Excel 12.0 Xml;HDR=YES;IMEX=1";

(Weitere Informationen unter http://www.connectionstrings.com/excel )

Weitere Informationen finden Sie unter http://msdn.microsoft.com/en-US/library/ms141683(v=sql.90).aspx und unter http://support.microsoft.com/kb/316934

Herstellen einer Verbindung zu Excel über ADODB über VBA unter http://support.microsoft.com/kb/257819

Microsoft JET 4-Details unter http://support.microsoft.com/kb/275561

rskar
quelle
4
Die Datenverbindung erfordert einen Dateinamen, der ein Show-Stopper ist, wenn die Aufgabe darin besteht, die aktuelle Datei abzufragen. Darüber hinaus kann eine Abfrage nicht wie eine Formel verwendet werden. Sie können nur eine feste Abfrage verwenden, um einen Bereich zu füllen. und es wird nicht automatisch aktualisiert. Es ist also unbrauchbar, die aktuelle Datei abzufragen, und als Drop-In-Ersatz für Formeln unbrauchbar.
ivan_pozdeev
2
@ivan_pozdeev Ich habe gerade mit Excel 2010 bestätigt, dass man die aktuelle Datei abfragen kann. Ich weiß nicht, ob spätere Ausgaben von Excel / Office dies nicht mehr möglich machen. Ich würde zustimmen, dass das Erstellen von selbstreferenziellen Tabellen über den Datenverbindungsassistenten umständlich ist - hauptsächlich, weil die Verbindung über den vollständigen Pfad zur Arbeitsmappe hergestellt wird, sodass das Umbenennen / Kopieren / Verschieben der Arbeitsmappe zu einer Unterbrechung oder Verwirrung der Ergebnisse führen würde. Für Arbeitsmappen, in denen die Verwendung von VBA kein Problem darstellt, ist die selbstreferenzielle Abfrage jedoch sehr einfach zu handhaben.
Rskar
@ivan_pozdeev Ich würde auch zustimmen, dass Excel nicht für die automatische Aktualisierung selbstreferenzieller Tabellen optimiert ist. Die Vermutung sind immer Daten aus externen Quellen. Automatische Aktualisierungen sind über die Registerkarte "Verwendung" der Verbindungseigenschaften möglich (wie beim erneuten Laden nach so vielen Minuten), und mit VBA können Neuberechnungsereignisse abgerufen werden. Trotzdem glaube ich nicht, dass ich dies jemals als Ersatz für Formeln überverkauft habe.
Rskar
2
„Es gibt viele gute Möglichkeiten , dieses zu erhalten getan“ - wenn das nicht über erhebliche Mängel polier , dass alle diese „feinen“ Wege tatsächlich für den Anwendungsfall angefordert (die sind , was ihre weite Verbreitung verhindert), weiß nicht ich , was ist.
ivan_pozdeev
8

tl; dr; Excel erledigt dies alles nativ - verwenden Sie Filter und / oder Tabellen

( http://office.microsoft.com/en-gb/excel-help/filter-data-in-an-excel-table-HA102840028.aspx )

Sie können Excel programmgesteuert über eine oledb-Verbindung öffnen und SQL für die Tabellen im Arbeitsblatt ausführen.

Aber Sie können alles tun, was Sie wollen, ohne Formeln, nur Filter.

  1. Klicken Sie auf eine beliebige Stelle in den Daten, die Sie anzeigen
  2. Gehen Sie zu den Daten in der Multifunktionsleiste
  3. Wählen Sie "Filter", es ist ungefähr in der Mitte und sieht aus wie ein Trichter
    • Sie haben jetzt Pfeile auf der engen Seite jeder Zelle in der ersten Reihe Ihres Tisches
  4. Klicken Sie auf den Pfeil auf der Telefonnummer und deaktivieren Sie Leerzeichen (letzte Option).
  5. Klicken Sie auf den Pfeil auf dem Nachnamen und wählen Sie die Reihenfolge aus (obere Option).

spielen Sie herum .. einige Dinge zu beachten:

  1. Sie können die gefilterten Zeilen auswählen und an einer anderen Stelle einfügen
  2. In der Statusleiste links sehen Sie, wie viele Zeilen Ihre Filterkriterien aus der Gesamtzahl der Zeilen erfüllen. (zB 308 von 313 gefundenen Datensätzen)
  3. Sie können in Excel 2010 auf Stationen nach Farben filtern
  4. Manchmal erstelle ich berechnete Spalten, die Status oder bereinigte Versionen von Daten enthalten, die Sie dann auch nach Thesen filtern oder sortieren können. (zB wie die Formeln in den anderen Antworten)

Tun Sie es mit Filtern, es sei denn, Sie werden es oft tun oder Sie möchten den Import von Daten irgendwo oder so etwas automatisieren. Der Vollständigkeit halber:

Eine c # Option:

 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();

Ein praktischer Ausgangspunkt ist ein Blick auf das Schema, da möglicherweise mehr vorhanden ist, als Sie denken:

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());
    }
}

dann, wenn Sie ein Blatt abfragen möchten:

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

HINWEIS - Verwenden Sie Tabellen in Excel!:

Excel verfügt über "Tabellen" -Funktionen, mit denen sich Daten eher wie eine Tabelle verhalten. Dies bietet Ihnen einige große Vorteile, lässt Sie jedoch nicht jede Art von Abfrage ausführen.

http://office.microsoft.com/en-gb/excel-help/overview-of-excel-tables-HA010048546.aspx

Für tabellarische Daten in Excel ist dies meine Standardeinstellung. Als erstes klicke ich in die Daten und wähle dann "Start als Tabelle" aus dem Home-Bereich des Menübands. Auf diese Weise können Sie standardmäßig filtern und sortieren und auf die Tabelle und die Felder nach Namen zugreifen (z. B. Tabelle [Feldname]). Dies ermöglicht auch Aggregatfunktionen für Spalten, z. B. Max und Durchschnitt


quelle
Wenn Sie die Spalten reduzieren möchten, würde ich persönlich die gefilterten Zeilen auf ein neues Blatt kopieren und die Spalten löschen, die ich nicht benötigte. man könnte sie verstecken, aber es lohnt sich selten.
1
using System.Data.OleDb; using System.Data;
1
Ich filtere jeden Tag und c #, um einige Male pro Woche auf Tabellenkalkulationen zuzugreifen. Wenn Sie c # verwenden, besteht die Tendenz darin, die Daten in eine Datenbank zu importieren, um wirklich damit zu spielen.
7

Sie können dies nativ wie folgt tun:

  1. Wählen Sie die Tabelle aus und sortieren Sie sie nach Excel nach Nachname
  2. Erstellen Sie erweiterte Filterkriterien für 2 Zeilen und 1 Spalte, z. B. in E1 und E2, wobei E1 leer ist und E2 die Formel enthält, in der =C6="" C6 die erste Datenzelle der Telefonnummernspalte ist.
  3. Wählen Sie die Tabelle aus und verwenden Sie den erweiterten Filter, kopieren Sie in einen Bereich, verwenden Sie den Kriterienbereich in E1: E2 und geben Sie an, wohin Sie die Ausgabe kopieren möchten

Wenn Sie dies programmgesteuert tun möchten, empfehlen wir Ihnen, den Makrorecorder zu verwenden, um die obigen Schritte aufzuzeichnen und den Code zu überprüfen.

Charles Williams
quelle
8
Frage gibt SQL an.
S Meaden
4

Sie können SQL in Excel verwenden. Es ist nur gut versteckt. Siehe dieses Tutorial:

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

Piotr Kołaczkowski
quelle
3
Das sieht so aus, als würde SQL verwendet, um Daten für den Import in Excel auszuwählen, aber keine Abfragen für die aktuelle Tabelle ausführen?
Rup
Sie müssen nur einen Namen für jede Tabelle in Excel erstellen (im Namensmanager) oder einfach die Tabelle auswählen und den Namen in das Feld eingeben, in dem die Zellenadresse angezeigt wird. Anschließend können Sie damit eine Abfrage für das Arbeitsblatt durchführen. In der Abfrage haben Sie die vollständige Adresse des Blattes.
Petrik
3

Könnte ich vorschlagen, QueryStorm auszuprobieren - es ist ein Plugin für Excel, das die Verwendung von SQL in Excel sehr bequem macht.

Es ist auch Freemium. Wenn Sie sich nicht für Autocomplete, Fehler-Squigglies usw. interessieren, können Sie es kostenlos verwenden. Einfach herunterladen und installieren, und Sie haben SQL-Unterstützung in Excel.

Haftungsausschluss: Ich bin der Autor.

anakisch
quelle
1
Obwohl es ein großartiges Tool ist, scheint es jetzt nur noch kostenpflichtig zu sein, mit Ausnahme einer 30-Tage-Testversion.
Marc
2

Wenn Sie dies einmal tun müssen, folgen Sie einfach den Beschreibungen von Charles. Es ist jedoch auch möglich, dies mit Excel-Formeln und Hilfsspalten zu tun, falls Sie den Filter dynamisch gestalten möchten.

Nehmen wir an, Ihre Daten befinden sich auf dem Blatt DataSheet und beginnen in Zeile 2 der folgenden Spalten:

  • A: Nachname
  • B: Vorname
  • C: Telefonnummer

Sie benötigen zwei Hilfsspalten auf diesem Blatt.

  • D2: =if(A2 = "", 1, 0)Dies ist die Filterspalte, die Ihrer Where-Bedingung entspricht
  • E2 : =if(D2 <> 1, "", sumifs(D$2:D$1048576, A$2:A$1048576, "<"&A2) + sumifs(D$2:D2, A$2:A2, A2)), entspricht der Bestellung von

Kopieren Sie diese Formeln so weit wie Ihre Daten gehen.

Erstellen Sie auf dem Blatt, auf dem Ihr Ergebnis angezeigt werden soll, die folgenden Spalten.

  • A: Eine Folge von Zahlen, die mit 1 in Zeile 2 beginnen. Dies begrenzt die Gesamtzahl der Zeilen, die Sie erhalten können (wie eine Begrenzung in der Folge).
  • B2: =match(A2, DataSheet!$E$2:$E$1048576, 0)Dies ist die Zeile der entsprechenden Daten
  • C2: =iferror(index(DataSheet!A$2:A$1048576, $B2), "")Dies sind die tatsächlichen Daten oder leer, wenn keine Daten vorhanden sind

Kopieren Sie die Formeln in B2 und C2 und kopieren Sie die Spalten C nach D und E.

einzigartig2
quelle
-1

Sie können mit dem nativen DB-Treiber für Excel in einer Sprache / Plattform Ihrer Wahl experimentieren. In der Java-Welt können Sie es mit http://code.google.com/p/sqlsheet/ versuchen , das einen JDBC-Treiber für die direkte Arbeit mit Excel- Tabellen bereitstellt. Ebenso können Sie Treiber für die DB-Technologie für andere Plattformen erhalten.

Ich kann jedoch garantieren, dass Sie mit der Anzahl der Funktionen, die diese Wrapper-Bibliotheken bieten, bald an eine Wand stoßen werden. Besser ist es, Apache HSSF / POI oder eine ähnliche Bibliotheksebene zu verwenden, aber es wird mehr Codierungsaufwand erfordern.

Akhilesh Singh
quelle
-1

Ich könnte mich missverstehen, aber ist das nicht genau das, was ein Pivot-Tisch tut? Haben Sie die Daten in einer Tabelle oder nur in einer gefilterten Liste? Wenn es sich nicht um eine Tabelle handelt, machen Sie es zu einer (Strg + L), wenn dies der Fall ist, aktivieren Sie einfach eine beliebige Zelle in der Tabelle und fügen Sie eine Pivot-Tabelle in ein anderes Blatt ein. Fügen Sie dann die Spalten Nachname, Vorname und Telefonnummer zum Zeilenabschnitt hinzu. Fügen Sie dann dem Filterbereich eine Telefonnummer hinzu und filtern Sie die Nullwerte heraus. Jetzt wie gewohnt sortieren.

Holmes IV
quelle
-1

Ich empfehle Ihnen, einen Blick auf die MySQL- CSV-Speicher-Engine zu werfen Sie im Wesentlichen jede CSV-Datei (die einfach aus Excel erstellt werden kann) in die Datenbank laden können. Sobald Sie diese haben, können Sie jeden gewünschten SQL-Befehl verwenden.

Es lohnt sich, einen Blick darauf zu werfen.

Juan Antonio Gomez Moriano
quelle
-1

Wenn Sie GDAL / OGR mit der gegen die Expat-Bibliothek kompiliert haben, können Sie den XLSX-Treiber verwenden , um XLSX- Dateien zu lesen und SQL-Ausdrücke an einer Eingabeaufforderung auszuführen. Verwenden Sie beispielsweise in einer osgeo4w- Shell im selben Verzeichnis wie die Tabelle das Dienstprogramm ogrinfo :

ogrinfo -dialect sqlite -sql "SELECT name, count(*) FROM sheet1 GROUP BY name" Book1.xlsx

führt eine SQLite- Abfrage aus sheet1und gibt das Abfrageergebnis in einer ungewöhnlichen Form aus:

INFO: Open of `Book1.xlsx'
      using driver `XLSX' successful.

Layer name: SELECT
Geometry: None
Feature Count: 36
Layer SRS WKT:
(unknown)
name: String (0.0)
count(*): Integer (0.0)
OGRFeature(SELECT):0
  name (String) = Red
  count(*) (Integer) = 849

OGRFeature(SELECT):1
  name (String) = Green
  count(*) (Integer) = 265
...

Oder führen Sie dieselbe Abfrage mit ogr2ogr aus , um eine einfache CSV- Datei zu erstellen:

$ ogr2ogr -f CSV out.csv -dialect sqlite \
          -sql "SELECT name, count(*) FROM sheet1 GROUP BY name" Book1.xlsx

$ cat out.csv
name,count(*)
Red,849
Green,265
...

Um dies mit älteren XLS- Dateien zu tun, benötigen Sie den XLS-Treiber , der für die FreeXL-Bibliothek erstellt wurde, was nicht wirklich üblich ist (z. B. nicht von OSGeo4w).

Mike T.
quelle
-2

Microsoft Access und LibreOffice Base können eine Tabelle als Quelle öffnen und SQL-Abfragen darauf ausführen. Dies wäre der einfachste Weg, um alle Arten von Abfragen auszuführen und das Durcheinander beim Ausführen von Makros oder beim Schreiben von Code zu vermeiden.

Excel verfügt auch über Autofilter und Datensortierung, mit denen viele einfache Abfragen wie in Ihrem Beispiel ausgeführt werden können. Wenn Sie Hilfe bei diesen Funktionen benötigen, ist Google eine bessere Quelle für Tutorials als ich.

jbo5112
quelle