使用 SQL 查询表以非常特定的顺序显示数据

Posted

技术标签:

【中文标题】使用 SQL 查询表以非常特定的顺序显示数据【英文标题】:Query a table using SQL to show data in a VERY specific order 【发布时间】:2018-04-05 18:02:45 【问题描述】:

我有一个关于 Excel/SQL 的相当简单的问题让我抓狂......

我在 Excel 中有一个简单的表格,位于工作表“DataBase”/Range A1:C2500(根据行号动态设置):

 A   |     B      |  C
ID   |    Date    | Price
--------------------------
1    | 01/01/20xx | 11
2    | 01/01/20xx | 12
3    | 01/01/20xx | 13
4    | 01/01/20xx | 14
5    | 01/01/20xx | 15
    ...
1500 | 01/01/20xx | 11500

在另一个名为“报告”的工作表中,我有一个报告需要以非常特定的 ID 顺序显示价格,该顺序在左列 (“A”) 中指定(偶尔会放置空白/空行)。

 A   |   B
ID   | Price
------------
10   | 

15   | 

300  | 


23   | 
20   | 
    ...

我已经通过使用以下带有 ADODB 连接的 SQL 字符串成功填充了“B”列(我知道这可以非常用其他方法轻松完成,但我正在实现 SQL,因为我假装将来查询 Access 表,而不是从 Excel 本身):

Set cn = New ADODB.Connection

With cn
    .Provider = "Microsoft.ACE.OLEDB.12.0"
    .ConnectionString = "Data Source=" & ThisWorkbook.FullName & "" _
    & ";Extended Properties=""Excel 12.0;HDR=Yes;"""
    .Open
End With

sql_string=
"SELECT [DataBase$A1:C2500].Price 
FROM [Report$A1:A30] LEFT JOIN [DataBase$A1:C2500] ON [Report$A1:A30].ID =[DataBase$A1:C2500].ID 
WHERE ((([DataBase$A1:C2500].Data)=#01/01/20xx# OR ([DataBase$A1:C2500].Data) is null);"

Set rs = cn.Execute(sql_string)

Sheets("Report").Range("B2").CopyFromRecordset rs
rs.close

当我在 Report.Column(A) 中最多有 ~700 行/ID 并且所有价格都在正确/预期的行中时,它工作正常。

如果我有 1000 或更多行/ID,则查询会将所有“空白”值分组在表格顶部,其余数据位于空白行下方...

所以,对于我的问题: 1)为什么会这样?是否容易纠正或 2) 有没有更好的方法可以使用 SQL 以非常特定的顺序从 excel/access 中提取数据,并在其间使用随机的空行?

【问题讨论】:

要以特定顺序返回 SQL 结果集,您需要在 Select 语句的末尾使用 ORDER BY Keyword。 感谢您的回复,但是,ORDER BY 在进行简单的排序时可以正常工作,例如升序、降序甚至使用 CASE ......但我必须涵盖所有CASE 语句中的可能性,它不实用且难以维护。 【参考方案1】:

好吧,经过一番挖掘……我找到了解决方案。不知道它是否是最有效的(与以前相比,我注意到有些滞后),但它确实有效。

它的工作原理是创建一个名为“TempTable”的表,其中包含按日期过滤的 ID 和价格数据。然后它按照我需要的顺序与包含 ID 的表左连接,并根据需要使用尽可能多的空白行。

这里是:

SELECT TempTable.Price
FROM [Report$A1:A30] 
LEFT JOIN 
    (SELECT [DataBase$A1:C2500].ID, [DataBase$A1:C2500].Price 
     FROM [DataBase$A1:C2500] 
     WHERE  (([DataBase$A1:C2500].Data)=#01/01/20xx#))  
     AS TempTable 
ON [Report$A1:A30].ID=TempTable.ID;

希望如果有人遇到同样的问题,它会有所帮助!

谢谢!

【讨论】:

以上是关于使用 SQL 查询表以非常特定的顺序显示数据的主要内容,如果未能解决你的问题,请参考以下文章

如何编写oracle SQL查询以特定顺序获取匹配和不匹配的行对(基于键列)

如何强制 SQL Server 以特定顺序执行查询

SQL Server 动态 PIVOT 查询 - 字段顺序

SQL Server:SELECT 查询以获取 DISTINCT 和 MAX 显示顺序值

以特定块返回SQL查询? [重复]

以准确的 MAX 顺序获取特定时间戳之间具有 MAX 值的记录