按州退还前5名销售额

use*_*983 3 sql

我正在尝试编写一个查询,该查询将返回每个提供债务人名称和净总额的州的前5名销售额.我已经提出了以下工作,但是,我确信有更好的方法,特别是如果添加了新的国家.

我试图理解WHERE IN语法,但不是我没有得到它.我很感激你的帮助.

SELECT  TOP 5 data.DebtorNameShort, data.State, data.NetTotal
FROM data
WHERE State= "VI"
ORDER BY NetTotal DESC
UNION ALL
SELECT  TOP 5 data.DebtorNameShort, data.State, data.NetTotal
FROM data
WHERE State= "NS"
ORDER BY NetTotal DESC
UNION ALL
SELECT  TOP 5 data.DebtorNameShort, data.State, data.NetTotal
FROM data
WHERE State= "sa"
ORDER BY NetTotal DESC
UNION ALL
SELECT  TOP 5 data.DebtorNameShort, data.State, data.NetTotal
FROM data
WHERE State= "wa"
ORDER BY NetTotal DESC
UNION ALL
SELECT  TOP 5 data.DebtorNameShort, data.State, data.NetTotal
FROM data
WHERE State= "ta"
ORDER BY NetTotal DESC
UNION ALL
SELECT  TOP 5 data.DebtorNameShort, data.State, data.NetTotal
FROM data
WHERE State= "ac"
ORDER BY NetTotal DESC
UNION ALL
SELECT  TOP 5 data.DebtorNameShort, data.State, data.NetTotal
FROM data
WHERE State= "ql"
ORDER BY NetTotal DESC
UNION ALL SELECT  TOP 5 data.DebtorNameShort, data.State, data.NetTotal
FROM data
WHERE State= "nt"
ORDER BY NetTotal DESC;
Run Code Online (Sandbox Code Playgroud)

Tar*_*ryn 7

基于TOP语法,我猜您正在使用SQL Server.您应该能够使用row_number()返回每个州的前5个值:

select DebtorNameShort, State, NetTotal
from
(
  select DebtorNameShort, State, NetTotal,
    row_number() over(partition by state order by NetTotal desc) seq
  from data 
) d
where seq <= 5
Run Code Online (Sandbox Code Playgroud)

row_number()是一个窗口函数,它允许为分区中的每个项创建一个顺序值 - 例如,您将通过分区对数据进行分区state.只要您按NetTotal降序排序,那么您可以过滤最终结果,只返回那些行数为1-5的行.