你能帮我解决一下sql的问题吗?我想让我当前的表返回一个“排名”字段,该字段显示每天基于“销售计数”的前3个产品。
我的表
Date Name ProductName SellCount
1/2/2014 John Product1 55
1/2/2014 John Product4 55
1/2/2014 John Product7 10
1/2/2014 John Product10 100
1/3/2014 John Product2 55
1/3/2014 John Product5 77
1/3/2014 John Product8 25
1/3/2014 John Product11 50
1/4/2014 John Product3 55
1/4/2014 John Product6 5
1/4/2014 John Product9 44
1/4/2014 John Product12 660
我希望它返回“排名”字段。所以我可以看到每天销售的前3个产品。此外,如果有两个卖出计数相等于彼此(例如“等级”字段日期“1/2/2014”):我希望它自动将等级中的一个分配为2而另一个为3。
Date Name ProductName SellCount Rank
1/2/2014 John Product1 55 3
1/2/2014 John Product4 55 2
1/2/2014 John Product10 100 1
1/3/2014 John Product11 50 3
1/3/2014 John Product2 55 2
1/3/2014 John Product5 77 1
1/4/2014 John Product9 44 3
1/4/2014 John Product3 55 2
1/4/2014 John Product12 660 1
我希望我的问题足够明确。如果你们需要我详细说明,请告诉我。我很感激SQL格式的解决方案。谢谢大家!
第2部分问题: 伙计如果我添加另一个列呼叫组
,该怎么办?我的新表是
Date Name Group ProductName SellCount
1/2/2014 John BigGroup1A Product7 10
1/2/2014 John BigGroup1A Product10 100
1/2/2014 John BigGroup1B Product2 55
1/2/2014 John Group1A Product1 55
1/3/2014 John Group1B Product6 5
1/3/2014 John Group1C Product9 44
1/3/2014 John Group1C Product4 55
1/3/2014 John LargeGroup1A Product5 77
1/4/2014 John LargeGroup2A Product8 25
1/5/2014 John LargeGroup2B Product12 660
1/6/2014 John MediumGroup2A Product11 50
1/7/2014 John MediumGroup2A Product3 55
(我添加了一个名为group的新列,我希望它返回排名,并根据“Date”,“Group”,“Sell Count”进行排名,因此它可以给出前3的排名。例如1 / 2/2014 John在“BIGGroup1A”中售出100和10.因此,产品10中的等级为1,产品7中的等级为2.在2014年1月1日的同一天,他在两个不同的组中出售55和55他们都应该是1.我填补了排名的其余部分,以匹配我追求的逻辑。
Date Name Group ProductName SellCount Rank
1/2/2014 John BigGroup1A Product7 10 2
1/2/2014 John BigGroup1A Product10 100 1
1/2/2014 John BigGroup1B Product2 55 1
1/2/2014 John Group1A Product1 55 1
1/3/2014 John Group1B Product6 5 1
1/3/2014 John Group1C Product9 44 2
1/3/2014 John Group1C Product4 55 1
1/3/2014 John LargeGroup1A Product5 77 1
1/4/2014 John LargeGroup2A Product8 25 1
1/5/2014 John LargeGroup2B Product12 660 1
1/6/2014 John MediumGroup2A Product11 50 2
1/7/2014 John MediumGroup2A Product3 55 1
再次感谢!帮助我找到第二部分的解决方案。
答案 0 :(得分:2)
将窗口函数与CTE一起用于此类问题:
CREATE TABLE #Temp(
[Date] DATE,
Name VARCHAR(20),
ProductName VARCHAR(20),
SellCount INT
)
INSERT INTO #Temp VALUES
('1/2/2014', 'John', 'Product1', 55), ('1/2/2014', 'John', 'Product4', 55), ('1/2/2014', 'John', 'Product7', 10),
('1/2/2014', 'John', 'Product10', 100), ('1/3/2014', 'John', 'Product2', 55), ('1/3/2014', 'John', 'Product5', 77),
('1/3/2014', 'John', 'Product8', 25), ('1/3/2014', 'John', 'Product11', 50), ('1/4/2014', 'John', 'Product3', 55),
('1/4/2014', 'John', 'Product6', 5), ('1/4/2014', 'John', 'Product9', 44), ('1/4/2014', 'John', 'Product12', 660);
--Start of the solution
;WITH CTE AS(
SELECT
*,
[Rank] = ROW_NUMBER() OVER(PARTITION BY Name, [Date] ORDER BY SellCount DESC)
FROM #Temp --Replace this with your Table
)
SELECT *
FROM CTE
WHERE [Rank] <= 3
ORDER BY [Date], [Rank] DESC
--End of the solution
DROP TABLE #Temp
<强> RESULT 强>
Date Name ProductName SellCount Rank
---------- -------------------- -------------------- ----------- --------------------
2014-01-02 John Product4 55 3
2014-01-02 John Product1 55 2
2014-01-02 John Product10 100 1
2014-01-03 John Product11 50 3
2014-01-03 John Product2 55 2
2014-01-03 John Product5 77 1
2014-01-04 John Product9 44 3
2014-01-04 John Product3 55 2
2014-01-04 John Product12 660 1
答案 1 :(得分:0)
在Sql Server中查看这些窗口函数我相信它会满足您的需求。
DENSE_RANK - 返回结果集分区内的行级别,排名中没有任何间隙。行的等级是一行加上有关行之前的不同等级的数量。
RANK - 返回结果集分区中每行的排名。行的等级是一行加上有关行之前的等级数。
ROW_NUMBER - 返回结果集分区中行的序号,从1开始,每个分区的第一行。