| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
共有 317 人关注过本帖
标题:求一句SQL代码
只看楼主 加入收藏
wengjl
Rank: 14Rank: 14Rank: 14Rank: 14
等 级:贵宾
威 望:109
帖 子:2367
专家分:4222
注 册:2007-4-27
结帖率:96.34%
收藏
已结贴  问题点数:20 回复次数:6 
求一句SQL代码
表的字段为:门店、员工、销售金额。现在想用一句SQL语句提取每个门店的前3名员工的信息和销售,以开展年终表彰奖励
求高手赐教,谢谢!
搜索更多相关主题的帖子: SQL 销售 员工 信息 代码 
2025-12-30 09:40
yiyanxiyin
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:9
帖 子:365
专家分:2400
注 册:2023-6-29
收藏
得分:20 
程序代码:
CREATE TABLE StoreSales (
    ID INT IDENTITY(1,1) PRIMARY KEY,
    StoreName NVARCHAR(50) COLLATE Chinese_PRC_CI_AS NOT NULL,
    EmployeeName NVARCHAR(50) COLLATE Chinese_PRC_CI_AS NOT NULL,
    SalesAmount DECIMAL(10,2) NOT NULL,
    SalesDate DATE DEFAULT GETDATE()
);

INSERT INTO StoreSales (StoreName, EmployeeName, SalesAmount) VALUES
(N'北京店', N'张三', 150000.00),
(N'北京店', N'李四', 180000.00),
(N'北京店', N'王五', 220000.00),
(N'北京店', N'赵六', 120000.00),
(N'北京店', N'钱七', 190000.00),
(N'北京店', N'孙八', 210000.00),
(N'上海店', N'周九', 130000.00),
(N'上海店', N'吴十', 160000.00),
(N'上海店', N'郑十一', 140000.00),
(N'上海店', N'王十二', 170000.00),
(N'上海店', N'李十三', 150000.00),
(N'广州店', N'陈十四', 250000.00),
(N'广州店', N'林十五', 230000.00),
(N'广州店', N'黄十六', 240000.00),
(N'广州店', N'刘十七', 200000.00),
(N'深圳店', N'马十八', 110000.00),
(N'深圳店', N'朱十九', 115000.00),
(N'深圳店', N'胡二十', 120000.00);

SELECT 
    t1.StoreName,
    t1.EmployeeName,
    t1.SalesAmount,
    COUNT(*) as 排名
FROM StoreSales t1
LEFT JOIN StoreSales t2 ON 
    t1.StoreName = t2.StoreName 
    AND t1.SalesAmount <= t2.SalesAmount
GROUP BY t1.StoreName, t1.EmployeeName, t1.SalesAmount
HAVING COUNT(*) <= 3
ORDER BY t1.StoreName, COUNT(*);
修正如果有并列情况的排名:
程序代码:
SELECT 
    t1.StoreName as 门店,
    t1.EmployeeName as 员工,
    t1.SalesAmount as 销售金额,
    COUNT(DISTINCT t2.SalesAmount) + 1 as 排名
FROM StoreSales t1
LEFT JOIN StoreSales t2 ON 
    t1.StoreName = t2.StoreName 
    AND t1.SalesAmount < t2.SalesAmount  -- 注意:是小于,不是小于等于
GROUP BY t1.StoreName, t1.EmployeeName, t1.SalesAmount
HAVING COUNT(DISTINCT t2.SalesAmount) < 3
ORDER BY t1.StoreName, 排名, t1.EmployeeName;


[此贴子已经被作者于2025-12-30 10:26编辑过]

2025-12-30 10:07
wengjl
Rank: 14Rank: 14Rank: 14Rank: 14
等 级:贵宾
威 望:109
帖 子:2367
专家分:4222
注 册:2007-4-27
收藏
得分:0 
非常感谢!

只求每天有一丁点儿的进步就可以了
2025-12-30 10:37
丁春秋yxp
Rank: 5Rank: 5
等 级:贵宾
威 望:10
帖 子:265
专家分:315
注 册:2017-10-31
收藏
得分:0 
可以使用窗口函数ROW_NUMBER()或RANK()来实现,以下是两种常见写法:

方法1:使用ROW_NUMBER()
sql
WITH ranked_sales AS (
    SELECT
        门店,
        员工,
        销售金额,
        ROW_NUMBER() OVER (PARTITION BY 门店 ORDER BY 销售金额 DESC) AS 排名
    FROM 表名
)
SELECT
    门店,
    员工,
    销售金额,
    排名
FROM ranked_sales
WHERE 排名 <= 3
ORDER BY 门店, 排名;
方法2:使用RANK()(处理并列情况)
sql
WITH ranked_sales AS (
    SELECT
        门店,
        员工,
        销售金额,
        RANK() OVER (PARTITION BY 门店 ORDER BY 销售金额 DESC) AS 排名
    FROM 表名
)
SELECT
    门店,
    员工,
    销售金额,
    排名
FROM ranked_sales
WHERE 排名 <= 3
ORDER BY 门店, 排名;
方法3:使用DENSE_RANK()(无间隔排名)
sql
WITH ranked_sales AS (
    SELECT
        门店,
        员工,
        销售金额,
        DENSE_RANK() OVER (PARTITION BY 门店 ORDER BY 销售金额 DESC) AS 排名
    FROM 表名
)
SELECT
    门店,
    员工,
    销售金额,
    排名
FROM ranked_sales
WHERE 排名 <= 3
ORDER BY 门店, 排名;
三种方法的区别:
ROW_NUMBER():即使销售金额相同,也会分配不同的序号(1,2,3,4...)

RANK():销售金额相同时排名相同,但会跳过后续序号(1,1,3,4...)

DENSE_RANK():销售金额相同时排名相同,不跳过序号(1,1,2,3...)

根据你的表彰规则选择合适的函数。如果只需要每个门店严格的3名员工(不考虑并列),建议使用ROW_NUMBER()。

2026-01-22 21:55
hsfisher
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:240
专家分:142
注 册:2009-4-26
收藏
得分:0 
2026-01-23 11:51
chychychy
Rank: 4
等 级:业余侠客
帖 子:514
专家分:220
注 册:2015-4-18
收藏
得分:0 
回复 4楼 丁春秋yxp
求教:您的语句好似无法直接在vfp中运行,求教应该如何改造才能适合
2026-01-23 14:05
丁春秋yxp
Rank: 5Rank: 5
等 级:贵宾
威 望:10
帖 子:265
专家分:315
注 册:2017-10-31
收藏
得分:0 
以下是引用chychychy在2026-1-23 14:05:44的发言:

求教:您的语句好似无法直接在vfp中运行,求教应该如何改造才能适合


我也不知道,这个是豆包写的。也可以问元宝、deepseek、文心、kimi、千问。只要你面对AI,一切都会秒秒钟搞定的。



[此贴子已经被作者于2026-1-30 21:52编辑过]

2026-01-30 21:46
快速回复:求一句SQL代码
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.930243 second(s), 8 queries.
Copyright©2004-2026, BCCN.NET, All Rights Reserved