Excel 테이블에서 SQL 쿼리를 실행하는 방법은 무엇입니까?


83

null이 아닌 전화 번호 필드가있는 AZ로 정렬 된 모든 성 필드의 다른 테이블에서 하위 테이블을 만들려고합니다. SQL을 사용하면이 작업을 매우 쉽게 수행 할 수 있지만 Excel에서 SQL 쿼리를 실행하는 방법에 대한 단서가 없습니다. 데이터를 postgresql로 가져 와서 쿼리하고 싶지만 약간 과도하게 보입니다.

내가하려는 일에 대해 SQL 쿼리 SELECT lastname, firstname, phonenumber WHERE phonenumber IS NOT NULL ORDER BY lastname가 트릭을 수행합니다. Excel이 기본적으로 할 수없는 일 이기에는 너무 간단 해 보입니다. Excel에서 이와 같은 SQL 쿼리를 실행하려면 어떻게해야합니까?


이 작업을 SQL 자체에서 수행 하시겠습니까, 아니면 응용 프로그램에서 수행 하시겠습니까?
John Bingham

2
나는 이것을 아주 철저히 조사했고 exceldevelopmentplatform.blogspot.com/2018/10/에
S Meaden

답변:


70

이를 수행하는 좋은 방법은 여러 가지가 있으며 다른 사람들이 이미 제안한 바 있습니다. "SQL 트랙을 통해 Excel 데이터 가져 오기"에 이어 몇 가지 지침이 있습니다.

  1. Excel에는 "데이터 연결 마법사"가있어 다른 데이터 소스 또는 동일한 Excel 파일 내에서 가져 오거나 연결할 수 있습니다.

  2. Microsoft Office (및 OS)의 일부로 관심있는 두 가지 공급자는 이전 "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 데이터 원본의 첫 ​​번째 행에는 필드 이름으로 사용할 수있는 열 머리글이 포함되어 있다고 가정합니다. 그렇지 않은 경우이 설정을 해제해야합니다. 그렇지 않으면 데이터의 첫 번째 행이 "사라져"필드 이름으로 사용됩니다. HDR= setting연결 문자열의 확장 속성에 옵션 을 추가하면 됩니다. 지정할 필요가없는 기본값은 HDR=Yes입니다. 열 머리글이없는 경우 다음을 지정해야합니다.HDR=No ; 공급자는 필드 이름을 F1, F2 등으로 지정합니다.

워크 시트 지정시주의 사항 : 제공자는 데이터 테이블이 지정된 워크 시트의 맨 위, 맨 왼쪽, 비어 있지 않은 셀로 시작한다고 가정합니다. 즉, 데이터 테이블은 문제없이 행 3, 열 C에서 시작할 수 있습니다. 그러나 예를 들어 A1 셀의 데이터 위와 왼쪽에 워크 시트 제목을 입력 할 수 없습니다.

범위 지정시주의 사항 : 워크 시트를 레코드 원본으로 지정하면 공급자는 공간이 허용하는 한 워크 시트의 기존 레코드 아래에 새 레코드를 추가합니다. 범위 (이름이 지정되거나 지정되지 않음)를 지정하면 Jet는 공간이 허용하는 한 범위의 기존 레코드 아래에 새 레코드도 추가합니다. 그러나 원래 범위를 다시 쿼리하는 경우 결과 레코드 집합에는 범위 밖에 새로 추가 된 레코드가 포함되지 않습니다.

C에 대한 데이터 유형 (해볼 가치가있는) REATE TABLE: Short, Long, Single, Double, Currency, 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 설정은 모든 데이터를 텍스트로 처리합니다. Provider=Microsoft.ACE.OLEDB.12.0;Data Source=Excel2007file.xlsx;Extended Properties="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에서

VBA를 통해 ADODB를 통해 Excel에 연결 http://support.microsoft.com/kb/257819에

http://support.microsoft.com/kb/275561의 Microsoft JET 4 세부 정보


4
데이터 연결에는 파일 이름이 필요하며, 이는 작업이 현재 파일을 쿼리 할 때 표시됩니다. 또한 쿼리는 수식과 같은 방식으로 사용할 수 없으며 고정 쿼리 만 사용하여 범위를 채울 수 있습니다. 자동으로 업데이트되지 않습니다. 따라서 현재 파일을 쿼리 할 수 ​​없으며 공식에 대한 드롭 인 대체물로 사용할 수 없습니다.
ivan_pozdeev

2
@ivan_pozdeev 방금 Excel 2010을 사용하여 현재 파일을 쿼리 할 수 ​​있음을 확인했습니다. 이후 버전의 Excel / Office에서이 기능이 더 이상 가능하지 않은지 모르겠습니다. 데이터 연결 마법사를 통해 자체 참조 테이블을 만드는 작업이 복잡하다는 데 동의합니다. 주로 통합 문서에 대한 전체 경로를 사용하여 연결이 이루어 지므로 통합 문서의 이름을 바꾸거나 복사 / 이동하면 깨지거나 혼란스러운 결과가 발생할 수 있습니다. 그러나 VBA 사용이 문제가되지 않는 통합 문서의 경우 자체 참조 쿼리는 매우 관리하기 쉽습니다.
rskar

@ivan_pozdeev Excel이 자체 참조 테이블을 자동으로 새로 고치는 데 최적화되어 있지 않다는 점도 동의합니다. 추정은 항상 외부에서 가져온 데이터입니다. 연결 속성의 사용 탭을 통해 자동 새로 고침이 가능하며 (몇 분마다 다시로드 할 때와 같이) VBA를 사용하면 재 계산 이벤트를 활용할 수 있습니다. 그래도 나는 이것을 공식의 드롭 인 대체품으로 과매도 한 적이 없다고 생각합니다.
rskar

2
"이 일을 얻을 수있는 많은 훌륭한 가지 방법이 있습니다"- 그 것을 통해 주요 결함를 왜곡 있지 않다면 모든 이 "좋은"방법이 실제로 (요청 된 사용 사례에 대해 가지고 있는 자신의 광범위한 사용을 방지 무엇을), I는 무엇인가 몰라.
ivan_pozdeev

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. 성의 화살표를 클릭하고 성의 az ordering (상위 옵션)을 선택합니다.

놀아 보자 ..

  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])으로 테이블 및 필드에 액세스 할 수 있습니다. 이는 또한 최대 및 평균과 같은 열에 대한 집계 함수를 허용합니다.


열을 줄이려면 필터링 된 행을 새 시트에 복사하고 필요하지 않은 열을 삭제합니다. 숨길 수는 있지만 거의 가치가 없습니다.

1
using System.Data.OleDb; using System.Data;

1
나는 매일 필터링하고 C #을 사용하여 일주일에 몇 번 스프레드 시트에 액세스합니다. C #을 사용할 때 데이터를 실제로 사용하기 위해 db로 데이터를 가져 오는 경향이 있습니다. 데이터가 SQL 서버에 있으면 실제로 쿼리를 수행하기 위해 중간 SQL 수준에서 수행 할 가치가 없습니다.

7

기본적으로 다음과 같이 할 수 있습니다.

  1. 표를 선택하고 Excel을 사용하여 성으로 정렬
  2. E1 및 E2에서 E1은 비어 있고 E2는 수식을 포함하는 2 행 x 1 열 고급 필터 기준을 만듭니다. =C6="" C6이 전화 번호 열의 첫 번째 데이터 셀인 이 됩니다.
  3. 표를 선택하고 고급 필터를 사용하고 E1 : E2의 기준 범위를 사용하여 범위에 복사하고 출력을 복사 할 위치를 지정합니다.

프로그래밍 방식으로이 작업을 수행하려면 매크로 레코더를 사용하여 위의 단계를 기록하고 코드를 살펴 보는 것이 좋습니다.


8
질문은 SQL을 지정합니다.
S Meaden

4

Excel에서 SQL을 사용할 수 있습니다 . 잘 숨겨져 있습니다. 이 자습서를 참조하십시오.

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


3
Excel로 가져올 데이터를 선택하기 위해 SQL을 사용하는 것처럼 보이지만 현재 스프레드 시트에 대해 쿼리를 실행하지 않습니까?
Rup

Excel (이름 관리자)에서 각 테이블의 이름을 만들거나 테이블을 선택하고 셀 주소가 표시된 상자에 이름을 입력하기 만하면됩니다. 그런 다음이를 사용하여 워크 시트에 대해 쿼리 할 수 ​​있습니다. 쿼리에서 시트의 전체 주소를 얻었으므로 스프레드 시트를 디스크의 다른 곳으로 이동하면 쿼리가 작동하지 않습니다
Petrik

3

QueryStorm을 제공하는 것이 좋습니다. 을 사용해 볼 할 수 있습니다. Excel에서 SQL을 사용하는 것이 매우 편리하게 만드는 Excel 용 플러그인입니다.

또한 부분 유료화입니다. 자동 완성, 오류 신호등에 신경 쓰지 않는다면 무료로 사용할 수 있습니다. 다운로드하여 설치하기 만하면 Excel에서 SQL 지원이 제공됩니다.

면책 조항 : 저는 저자입니다.


1
안타깝게도 훌륭한 도구이지만 이제는 30 일 평가판을 제외하고는 유료 인 것으로 보입니다.
Marc

2

이 작업을 한 번만 수행해야하는 경우 Charles의 설명을 따르지만 필터를 동적으로 만들려는 경우 Excel 수식 및 도우미 열을 사용하여이 작업을 수행 할 수도 있습니다.

데이터가 데이터 시트 시트에 있고 다음 열의 2 행에서 시작한다고 가정합니다.

  • A : 성
  • B : 이름
  • C : 전화 번호

이 시트에 두 개의 도우미 열이 필요합니다.

  • 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로 복사합니다.


0

Excel 파일을 직접 쿼리하는 경우 esProc를 사용해보십시오. https://esprocforbp.medium.com/directly-query-excel-text-files-using-sql-5315788231e4참조하십시오 . 일반 SQL을 지원할뿐만 아니라 Group HAVING, Subquery, Nested Subquery, Join, 심지어 'with… as'Table Expression도 지원합니다. 예를 들면 다음과 같습니다.

$with A as
(select NAME as DEPT from E:/department.xlsx where NAME='HR' or NAME='Sales') 
select A.DEPT DEPT,count(*) NUM,avg(B.SAL_ARY) AVG_SALARY from A left join E:/employee.xlsx B on A.DEPT=B.DEPT
where B.GENDER='F' group by A.DEPT

Excel에서 영역을 쿼리하려면 데이터를 클립 보드에 복사합니다. 그런 다음 esProc는 클립 보드 기능에 액세스하여 데이터 테이블을 가져온 다음 단일 테이블 쿼리를 수행합니다. 여러 영역을 쿼리하려면 각 데이터 영역을 esProc에 복사하고 esProc에서 여러 테이블을 가져와 예제와 같이 다중 테이블 쿼리를 수행합니다.

면책 조항 : 이것은 우리 도구 esProc에 관한 것입니다. 부분 유료화입니다.


-1

원하는 언어 / 플랫폼에서 Excel 용 기본 DB 드라이버로 실험 할 수 있습니다. Java 세계에서는 Excel 시트로 직접 작업하기위한 JDBC 드라이버를 제공하는 http://code.google.com/p/sqlsheet/ 를 사용해 볼 수 있습니다. 마찬가지로 다른 플랫폼 용 DB 기술 용 드라이버를 얻을 수 있습니다.

그러나 이러한 래퍼 라이브러리가 제공하는 수많은 기능으로 곧 벽에 부딪 힐 것이라고 장담 할 수 있습니다. 더 나은 방법은 Apache HSSF / POI 또는 유사한 수준의 라이브러리를 사용하는 것이지만 더 많은 코딩 작업이 필요합니다.


-1

오해 할 수도 있지만 이것이 피벗 테이블이하는 일이 아닙니까? 테이블에 데이터가 있습니까, 아니면 필터링 된 목록에 있습니까? 테이블이 아닌 경우 테이블로 만듭니다 (ctrl + l). 테이블의 셀을 활성화하고 다른 시트에 피벗 테이블을 삽입하면됩니다. 그런 다음 lastname, firstname, phonenumber 열을 행 섹션에 추가하십시오. 그런 다음 필터 섹션에 전화 번호를 추가하고 null 값을 필터링합니다. 이제 평소처럼 정렬합니다.



-1

당신이있는 경우 GDAL / OGR이 국외 거주자 라이브러리에 대한 컴파일, 당신은 사용할 수 있습니다 XLSX 드라이버를 프롬프트 명령에서 파일 및 실행 SQL 식을 .XLSX 읽을 수 있습니다. 예를 들어, 스프레드 시트와 동일한 디렉토리에 있는 osgeo4w 셸에서 ogrinfo 유틸리티를 사용 합니다.

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

에서 SQLite 쿼리를 실행 sheet1하고 쿼리 결과를 비정상적인 형식으로 출력합니다.

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
...

또는 ogr2ogr 을 사용하여 동일한 쿼리를 실행하여 간단한 CSV 파일 을 만듭니다 .

$ 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
...

이전 .xls 파일과 유사하게하려면 실제로 일반적이지 않은 (예 : OSGeo4w가 아닌) FreeXL 라이브러리에 대해 빌드 된 XLS 드라이버 가 필요합니다 .


-2

Microsoft Access 및 LibreOffice Base는 스프레드 시트를 소스로 열고 SQL 쿼리를 실행할 수 있습니다. 이것은 모든 종류의 쿼리를 실행하는 가장 쉬운 방법이며 매크로를 실행하거나 코드를 작성하는 번거 로움을 피할 수 있습니다.

Excel에는 또한 예제와 같은 많은 간단한 쿼리를 수행하는 자동 필터 및 데이터 정렬 기능이 있습니다. 이러한 기능에 대한 도움이 필요하면 Google이 나보다 튜토리얼을위한 더 나은 소스가 될 것입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.