Sql 您如何从两个不同的公司中选择前五名?
我试图做这个1SQL语句,其中第一个1的公司编号是1,第二个是2 理想的结果是从每家公司中选出最优秀的销售人员,在本例中有2家公司,但我需要一个查询,根据公司数量(1,2,3)得出结果(5,10,15) ** 从第一个到第二个**Sql 您如何从两个不同的公司中选择前五名?,sql,sql-server,Sql,Sql Server,我试图做这个1SQL语句,其中第一个1的公司编号是1,第二个是2 理想的结果是从每家公司中选出最优秀的销售人员,在本例中有2家公司,但我需要一个查询,根据公司数量(1,2,3)得出结果(5,10,15) ** 从第一个到第二个** Total Deals First Last 1 MARK O'DELL 1 Edward Thatch 1 FranK Cavelier 1 Ch
Total Deals First Last
1 MARK O'DELL
1 Edward Thatch
1 FranK Cavelier
1 Chris Fluffer
1 Chris Farley
首先,可以简化每个子查询:
SELECT COUNT(d.DealNumber) AS Deals, e.FirstName AS First,
e.LastName AS Last, e.EntityNumber
FROM DealEmployee de INNER JOIN
Entity e
ON de.EmployeeID = e.EntityID RIGHT OUTER JOIN
Deal d
ON de.DealID = d.DealID
WHERE d.PurchaseDate >= '2014-01-01' AND
d.PurchaseDate <= '2014-11-01' AND
d.CompanyNumber = '1' AND d.Status = 2 AND de.Type = 'Salesperson'
GROUP BY e.FirstName, e.LastName, e.EntityNumber
ORDER BY TotalDeals DESC;
SELECT t.*
FROM (SELECT COUNT(d.DealNumber) AS Deals, e.FirstName AS First,
e.LastName AS Last, e.EntityNumber,
ROW_NUMBER() OVER (PARTITION BY e.FirstName, e.LastName, e.EntityNumber
ORDER BY COUNT(d.DealNumber) DESC) as seqnum
FROM DealEmployee de INNER JOIN
Entity e
ON de.EmployeeID = e.EntityID RIGHT OUTER JOIN
Deal d
ON de.DealID = d.DealID
WHERE d.PurchaseDate >= '2014-01-01' AND
d.PurchaseDate <= '2014-11-01 00:00:00' AND
d.CompanyNumber = '1' AND d.Status = 2 AND de.Type = 'Salesperson'
GROUP BY e.FirstName, e.LastName, e.EntityNumber
) t
WHERE seqnum <= 5
ORDER BY TotalDeals DESC;
你希望结果中有多少条记录:5条(两家公司加起来)或10条(每家公司5条)?每个公司5条,但如果能在超过2家公司的情况下工作就好了。请用样本数据和期望的结果编辑你的问题。好的,我做了,希望答案是显示每个公司的前5名销售经理,但在这种情况下,有多个公司。我会将公司编号设为变量吗?这有可能吗?这会带来59笔交易,而我只想让每家公司得到5笔。您还可以帮助我理解Seqnum、T.*和分区的含义吗?Seqnum变量应该是销售人员的计数吗?因为它为59个变量中的每一个返回1rows@Learningyouslowly . . . 关键是
partitionby
子句,但我不确定哪个是正确的。从您的文本来看,它似乎是按公司编号划分的,但该字段不起作用。它必须是分组依据
字段之一。您有什么建议?
SELECT COUNT(d.DealNumber) AS Deals, e.FirstName AS First,
e.LastName AS Last, e.EntityNumber
FROM DealEmployee de INNER JOIN
Entity e
ON de.EmployeeID = e.EntityID RIGHT OUTER JOIN
Deal d
ON de.DealID = d.DealID
WHERE d.PurchaseDate >= '2014-01-01' AND
d.PurchaseDate <= '2014-11-01' AND
d.CompanyNumber = '1' AND d.Status = 2 AND de.Type = 'Salesperson'
GROUP BY e.FirstName, e.LastName, e.EntityNumber
ORDER BY TotalDeals DESC;
SELECT t.*
FROM (SELECT COUNT(d.DealNumber) AS Deals, e.FirstName AS First,
e.LastName AS Last, e.EntityNumber,
ROW_NUMBER() OVER (PARTITION BY e.FirstName, e.LastName, e.EntityNumber
ORDER BY COUNT(d.DealNumber) DESC) as seqnum
FROM DealEmployee de INNER JOIN
Entity e
ON de.EmployeeID = e.EntityID RIGHT OUTER JOIN
Deal d
ON de.DealID = d.DealID
WHERE d.PurchaseDate >= '2014-01-01' AND
d.PurchaseDate <= '2014-11-01 00:00:00' AND
d.CompanyNumber = '1' AND d.Status = 2 AND de.Type = 'Salesperson'
GROUP BY e.FirstName, e.LastName, e.EntityNumber
) t
WHERE seqnum <= 5
ORDER BY TotalDeals DESC;