以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  [求助] 请教老师帮忙指导写一个sql语句  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=99778)

--  作者:ltty5200
--  发布时间:2017/4/26 16:52:00
--  [求助] 请教老师帮忙指导写一个sql语句
我的表有如下几列,我想用一个sql语句查询出每个店铺订单数量排名前50的数据,但是感觉好复杂,编不了这个语句,请老师帮忙编写一下,在此拜谢!
每个货号在不同的店铺有不同的订单数量,每个店铺也会有不同的货号以及该产品的订单数量。

货号 店铺名称 年份 季节 品名 订单数量 吊牌金额
32DC10227 (停)4易门店 2017 上衣 8 1584.00
32DC10239 (停)4易门店 2017 上衣 8 1584.00

--  作者:菲舍尔
--  发布时间:2017/4/26 17:30:00
--  
se!ect top 50 sum(订单数量)as  订单总数,货号,店铺名称 from 表 group by 店铺名称,货号 order by 订单总数 DESC

--  作者:有点色
--  发布时间:2017/4/26 17:41:00
--  

参考代码,把红色代码替换成50即可

 

select a.* from (Select 店铺名称, 货号, sum(订单数量) as 总数量 from {表c} group by 店铺名称, 货号) as a where 1 > (select count(*) from (Select 店铺名称, 货号, sum(订单数量) as 总数量 from {表c} group by 店铺名称, 货号) as b where b.店铺名称 = a.店铺名称 and b.总数量 > a.总数量 ) order by a.店铺名称, a.总数量

[此贴子已经被作者于2017/4/26 17:42:51编辑过]

--  作者:ltty5200
--  发布时间:2017/4/26 17:54:00
--  
谢谢回复,您的代码执行后只能查询出表里面订单数量为前50的数据,也就是只有50条数据。我需要的是每个店铺的订单数量为前50名的数据,该如何修改?
--  作者:ltty5200
--  发布时间:2017/4/26 17:55:00
--  
老师,我执行您的代码后,半天没有任何反应,是不是哪里错了?
--  作者:有点色
--  发布时间:2017/4/26 18:06:00
--  
以下是引用ltty5200在2017/4/26 17:55:00的发言:
老师,我执行您的代码后,半天没有任何反应,是不是哪里错了?

 

是不是你的数据量太大?你做个有数据的例子上来看看,比如导入 1千行、1万行数据测试。


--  作者:ltty5200
--  发布时间:2017/4/26 18:40:00
--  
老师,是的,您的语句执行后达到要求了,可是执行速度太慢,而且程序还会卡死。大概差不多10分钟才查询出来的(只有1.8W行数据),能再给优化下吗?
--  作者:ltty5200
--  发布时间:2017/4/26 18:49:00
--  
我把项目复制上来了。里面有1.85W行数据,麻烦老师优化下。目的是查询出每个店铺订单数量排名前50的数据。补充一下:每个货号只会在个店铺出现一次,不会重复。谢谢!
 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:管理项目5.zip


--  作者:有点色
--  发布时间:2017/4/26 19:14:00
--  

 不要用sql语句来做,结合代码

 

Dim idx As String = "-1,"
Dim idx_temp As String = ""
Dim pdr As DataRow = Nothing
Dim count As Integer = 0
Dim cs As String = "店铺名称"
For Each dr As DataRow In DataTables("表A").Select("", "店铺名称, 订单数量 desc")
    Dim flag As Boolean = False
    If pdr IsNot Nothing Then
        For Each c As String In cs.split(",")
            If pdr(c) <> dr(c) Then
                flag = True
                Exit For
            End If
        Next
    End If
    If flag Then
        idx &= idx_temp
        count = 1
        idx_temp = dr("_Identify") & ","
    Else
        count += 1
        If count <= 50 Then
            idx_temp &= dr("_Identify") & ","
        End If
    End If
   
    pdr = dr
Next
msgbox("查询完毕")
If count <= 50 Then
    idx &= idx_temp
End If
Tables("表A").filter = "_Identify in (" & idx.trim(",") & ")"
Tables("表A").sort = "店铺名称, 订单数量 desc"


--  作者:ltty5200
--  发布时间:2017/4/26 22:12:00
--  
谢谢老师耐心指导。但是如果不用表,非要用SQL查询的话有办法吗?求帮忙,尽量用sql,拜谢了。