我正在尝试从Excel工作表中选择ID(QTYSOLDTHISDAY)。但是下面的代码继续选择具有MAX值的许多记录。我只需要一个选择的记录。我已经尝试过ID ID,它没有用。这是我的代码。感谢
Dept(0) = "01"
Dept(1) = "02"
Dept(2) = "03"
Dept(3) = "04"
Dept(4) = "05"
Dim DeptNum As String
Using cn As New OleDbConnection With {.ConnectionString = String.Format(ConnectionNoHeader6, FileName6)}
Dim dt7 As New DataTable
cn.Open()
For Each DeptNum In Dept
Dim cmd1 As OleDbCommand = New OleDbCommand(
<Text>
SELECT
ID,
ARTNAME,
NETAMOUNTTHISDAY,
QTYSOLDTHISDAY,
AVAILABLESTOCK
FROM [<%= SheetName6 %>$]
WHERE ID = <%= DeptNum %> and QTYSOLDTHISDAY=(select max(QTYSOLDTHISDAY) from [<%= SheetName6 %>$] where ID = <%= DeptNum %> group by ID)
</Text>.Value,
cn
)
dt7.Load(cmd1.ExecuteReader)
For Each row As DataRow In dt7.Rows
Next
DataGridView2.DataSource = dt7
Next DeptNum
End Using
答案 0 :(得分:0)
由于excel是Microsoft产品,因此我假设Select top
是有效的声明。尝试在查询中添加Top 1
。
SELECT TOP 1
ID,
ARTNAME,
NETAMOUNTTHISDAY,
QTYSOLDTHISDAY,
AVAILABLESTOCK
FROM [<%= SheetName6 %>$]
WHERE ID = <%= DeptNum %>
and QTYSOLDTHISDAY=(select max(QTYSOLDTHISDAY)
from [<%= SheetName6 %>$]
where ID = <%= DeptNum %>
group by ID)
如果有多个记录具有相同的QTYSOLDTHISDAY
,您如何决定返回哪一个?如果您需要做出类似的决定,请在外部查询中使用Order By
来获取您需要在结果中的最高位置返回的记录。
答案 1 :(得分:0)
我花了半个小时在Excel上搜索SQL的语言参考但未成功 - 验证您可以像使用SQL Server一样使用TOP n
。由于其他人认为它有效,我会继续假设。
使用TOP 1
您可以通常简化您的陈述:
SELECT TOP 1
ID, ARTNAME, NETAMOUNTTHISDAY, QTYSOLDTHISDAY, AVAILABLESTOCK
FROM [<%= SheetName6 %>$]
WHERE ID = <%= DeptNum %>
ORDER BY QTYSOLDTHISDAY DESC
单独的子查询中没有必要找到最大QTYSOLDTHISDAY
。只需按降序排序并选择第一行。这样就可以从共享最大QTYSOLDTHISDAY
的行中随意选择。
您可以向ORDER BY
添加更多列,以添加一个或多个断路器。对于instqance,如果您有多个行共享最大QTYSOLDTHISDAY
,并且您希望其中包含最小的ID
:
ORDER BY QTYSOLDTHISDAY DESC, ID