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 lastname
den 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?
Antworten:
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.
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.
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).
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.
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.)
Beispiel: Lesen eines Arbeitsblatts:
SELECT * FROM [Sheet1$]
Beispiel: Lesen eines Bereichs:
SELECT * FROM MyRange
Beispiel: Lesen eines unbenannten Zellbereichs:
SELECT * FROM [Sheet1$A1:B10]
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= setting
zu den erweiterten Eigenschaften der Verbindungszeichenfolge. Der Standardwert, der nicht angegeben werden muss, istHDR=Yes
. Wenn Sie keine Spaltenüberschriften haben, müssen Sie angebenHDR=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
quelle
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.
spielen Sie herum .. einige Dinge zu beachten:
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:
Ein praktischer Ausgangspunkt ist ein Blick auf das Schema, da möglicherweise mehr vorhanden ist, als Sie denken:
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
using System.Data.OleDb;
using System.Data;
Sie können dies nativ wie folgt tun:
=C6=""
C6 die erste Datenzelle der Telefonnummernspalte ist.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.
quelle
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
quelle
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.
quelle
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:
Sie benötigen zwei Hilfsspalten auf diesem Blatt.
=if(A2 = "", 1, 0)
Dies ist die Filterspalte, die Ihrer Where-Bedingung entspricht=if(D2 <> 1, "", sumifs(D$2:D$1048576, A$2:A$1048576, "<"&A2) + sumifs(D$2:D2, A$2:A2, A2))
, entspricht der Bestellung vonKopieren Sie diese Formeln so weit wie Ihre Daten gehen.
Erstellen Sie auf dem Blatt, auf dem Ihr Ergebnis angezeigt werden soll, die folgenden Spalten.
=match(A2, DataSheet!$E$2:$E$1048576, 0)
Dies ist die Zeile der entsprechenden Daten=iferror(index(DataSheet!A$2:A$1048576, $B2), "")
Dies sind die tatsächlichen Daten oder leer, wenn keine Daten vorhanden sindKopieren Sie die Formeln in B2 und C2 und kopieren Sie die Spalten C nach D und E.
quelle
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.
quelle
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.
quelle
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.
quelle
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
sheet1
und 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).
quelle
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.
quelle