MS SQL Excel文件,Case语句或替代方案

9 浏览
0 Comments

MS SQL Excel文件,Case语句或替代方案

我有一个用于处理数据的Excel文件。数据以.csv文件的形式进入,我想要输出多个不同的工作表,每个工作表都以不同的方式处理数据。一旦初始设置完成,执行此任务的人将不是我。在探索了许多方法之后(例如设置SQL或Access数据库/使用读取和处理数据的Excel函数),我决定在导入.csv文件后,Excel文件自己查询。我通过以下方法找到了如何实现:\n如何在Excel表上运行SQL查询?\n我对SQL的方言不熟悉,我能找到的唯一参考是:\nhttps://support.microsoft.com/en-us/help/136699/description-of-the-usage-of-joins-in-microsoft-query\n这在大多数情况下都有效。在某些情况下,Jet SQL有效,但其他时候会返回错误。\n表中有三列,Cust Status,\'MinDateFiledBorrower\'和\'MinDateFiledCoBorrower\'。借款人和共同借款人的日期字段中可能有数据,也可能为NULL。我试图获取借款人和共同借款人的最早日期。我似乎找不到JetSQL中Case语句的语法,并且我尝试时收到的错误让我怀疑它们不被支持。\n数据:\n

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

\n我最近的尝试:\n

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

\n返回错误“在SELECT列列表之后不希望出现\'DischargeCombine$\'”。它没有行标记,但我猜它指的是Case语句中的第一个DischargeCombine$。\n非常感谢您的帮助!

0
0 Comments

问题的出现原因是MS Access Jet/ACE SQL Engine不支持ANSI-92的CASE语句,因此需要寻找替代方法。解决方法是使用嵌套的IIF函数或者使用SWITCH函数。

具体的解决方法如下:

1. 使用嵌套的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

2. 使用SWITCH函数:

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实际上是一个GUI界面,用于操作Jet/ACE引擎(.dll文件),可以用来查询Excel工作簿,也可以查询本地的Jet/ACE表,甚至可以查询CSV文件。事实上,不需要安装MSAccess.exe程序即可查询.mdb或.accdb文件,同样也可以查询.xls、.xlsx、.xlsm、.xlsb文件。

希望这可以帮到你!如果你在使用别名或子组时遇到其他错误,请尝试重新使用MS Access。

0