首页 > 解决方案 > Excel 文件、案例陈述或替代方案的 MS SQL Excel

问题描述

我有一个用来处理数据的 excel 文件。它通过一个 .csv 文件进入,我想输出很多不同的工作表,每个工作表都以不同的方式处理数据。初始设置完成后,执行此任务的人将不是我。在探索了许多这样做的方法之后,(例如设置 SQL 或 Access 数据库/使用读取和处理数据的 excel 函数),我决定在导入 .csv 后查询自身的 Excel 文件。

我发现了如何使用以下方法: 如何在 Excel 表上运行 SQL 查询?

SQL的方言对我来说很陌生,我能找到的唯一参考是:https: //support.microsoft.com/en-us/help/136699/description-of-the-usage-of-joins-in- microsoft-query 在大多数情况下都有效。在某些情况下,Jet SQL 可以工作,但有时它会返回错误。

我在表中有三列,客户状态、“MinDateFiledBorrower”和“MinDateFiledCoBorrower”。日期字段中的一个或两个可能包含数据,或者其中一个可能为 NULL。我正在尝试获取借款人和共同借款人的最短日期。我似乎无法在 JetSQL 中找到 Case 语句的语法,而且我在尝试时收到的错误让我怀疑它们不受支持。

数据:

Cust Status    'MinDateFiledBorrower'    'MinDateFiledCoBorrower'
B-1001         9/15/2004 0:00            11/1/2006 0:00
B-1002         9/17/2004 0:00            11/9/2006 0:00
B-1003         10/7/2004 0:00            NULL 
B-1004         NULL                      10/14/2004 0:00    
B-1005         9/23/2004 0:00            12/21/2006 0:00
B-1007         10/19/2004 0:00           2/12/2007 0:00
B-1008         10/22/2004 0:00           2/8/2007 0:00
B-101          NULL                      12/11/2001 0:00    
B-1010         10/25/2004 0:00           NULL
B-1011         10/28/2004 0:00           6/8/2007 0:00
B-1012         11/4/2004 0:00            6/28/2007 0:00
B-2298         5/12/2005 0:00            NULL
B-23           NULL                      2/26/2007 0:00
B-230          NULL                      5/15/2012 0:00
B-2300         NULL                      5/24/2005 0:00
B-2301         NULL                      6/30/2005 0:00

我最近的尝试:

select
    `DischargeCombine$`.`Cust Status`
    ,`DischargeCombine$`.`'MinDateFiledBorrower'`
    ,`DischargeCombine$`.`'MinDateFiledCoBorrower'`
    ,case when `DischargeCombine$`.`'MinDateFiledBorrower'` is null then `DischargeCombine$`.`'MinDateFiledCoBorrower'`
    when `DischargeCombine$`.`'MinDateFiledCoBorrower'` is null then `DischargeCombine$`.`'MinDateFiledBorrower'`
    when `DischargeCombine$`.`'MinDateFiledBorrower'`>=`DischargeCombine$`.`'MinDateFiledCoBorrower'` then `DischargeCombine$`.`'MinDateFiledCoBorrower'`
    when `DischargeCombine$`.`'MinDateFiledBorrower'`<`DischargeCombine$`.`'MinDateFiledCoBorrower'` then `DischargeCombine$`.`'MinDateFiledBorrower'` end as FirstDischarge
from `C:\Query Exports\BK Scrub Processing File.xlsx`.`DischargeCombine$` `DischargeCombine$`

DischargeCombine$返回错误“在 SELECT 列列表之后不期望 ' '”。它没有线标记,但我猜这意味着DischargeCombine$Case Statement 的第一个。

任何帮助将不胜感激!

标签: sqlexcelms-query

解决方案


MS Access Jet/ACE SQL 引擎不支持 ANSI-92CASE语句,我在方言的其他缺失 ANSI 方法中提出了该语句

代替,考虑条件逻辑CASE的嵌套函数。IIF下面的调整还使用了一个简短的表别名来避免冗长的重复标识符:

select
     d.`Cust Status`
    , d.`'MinDateFiledBorrower'`
    , d.`'MinDateFiledCoBorrower'`
    , iif(d.`'MinDateFiledBorrower'` is null, d.`'MinDateFiledCoBorrower'`,
          iif(d.`'MinDateFiledCoBorrower'` is null, d.`'MinDateFiledBorrower'`,
              iif( d.`'MinDateFiledBorrower'` >= d.`'MinDateFiledCoBorrower'`, d.`'MinDateFiledCoBorrower'`, 
                  iif(d.`'MinDateFiledBorrower'` < d.`'MinDateFiledCoBorrower'`, d.`'MinDateFiledBorrower'`, null
                     )
                 )
             )
        ) as FirstDischarge
from `C:\Query Exports\BK Scrub Processing File.xlsx`.`DischargeCombine$`  d

或者,考虑SWITCH(从 VBA 借用的 Access SQL 特定方法):

select
     d.`Cust Status`
    , d.`'MinDateFiledBorrower'`
    , d.`'MinDateFiledCoBorrower'`
    , switch(d.`'MinDateFiledBorrower'` is null, d.`'MinDateFiledCoBorrower'`,
             d.`'MinDateFiledCoBorrower'` is null, d.`'MinDateFiledBorrower'`,
             d.`'MinDateFiledBorrower'` >= d.`'MinDateFiledCoBorrower'`, d.`'MinDateFiledCoBorrower'`, 
             d.`'MinDateFiledBorrower'` < d.`'MinDateFiledCoBorrower'`, d.`'MinDateFiledBorrower'`
            ) as FirstDischarge
from `C:\Query Exports\BK Scrub Processing File.xlsx`.`DischargeCombine$`  d

顺便说一句,MS Access 实际上是 Jet/ACE 引擎(.dll 文件)的 GUI,您可以使用它来查询 Excel 工作簿,还可以查询本机 Jet/ACE 表,甚至查询 CSV 文件。事实上,不需要安装 MSAccess.exe 程序即可查询.mdb.accdb类似.xls, .xlsx, .xlsm, .xlsb文件。


推荐阅读