MAX Group by ID

时间:2013-04-13 23:02:31

标签: sql vb.net

我正在尝试从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

2 个答案:

答案 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