使用 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查询以特定顺序获取匹配和不匹配的行对(基于键列)