Select 所有对应行的特定值
Select specific value for all corresponding rows
我正在尝试获取 Top Customers 的结果集,该结果集按基于年份和总数的排名值排序。容易,对吧?
但是,现在我想指定年份,并为该客户提供所有行 return 那一年的排名值。
例如,假设我有以下数据(为便于排名硬编码):
SELECT * FROM
(
SELECT 'Customer A' as Cust,'123.45' as Total,'2016' as [year],1 as [rank]
UNION
SELECT 'Customer A','123.45','2017',3
UNION
SELECT 'Customer B','46.67','2016',2
UNION
SELECT 'Customer B','423.45','2017',1
UNION
SELECT 'Customer B','123.45','2018',1
UNION
SELECT 'Customer C','23.45','2016',3
UNION
SELECT 'Customer C','223.45','2017',2
UNION
SELECT 'Customer C','23.45','2018',2
) as a
ORDER BY a.[year], a.[rank]
如果我指定 2016 年,我想为每个客户选择 2016 年的排名值,return 为结果集中该客户的每一行选择该客户的排名值 - 应该看起来像以下:
=>
我能处理的最接近的是以下内容,但它只是使其他单元格为空:
DECLARE @RankBy VARCHAR(4) = '2016'
SELECT [Year],
Cust,
[Total],
[rank] = (SELECT a.[rank] WHERE Cust = a.Cust AND [Year] = @RankBy)
FROM
(
SELECT 'Customer A' as Cust,'123.45' as Total,'2016' as [year],1 as [rank]
UNION
SELECT 'Customer A','123.45','2017',3
UNION
SELECT 'Customer B','46.67','2016',2
UNION
SELECT 'Customer B','423.45','2017',1
UNION
SELECT 'Customer B','123.45','2018',1
UNION
SELECT 'Customer C','23.45','2016',3
UNION
SELECT 'Customer C','223.45','2017',2
UNION
SELECT 'Customer C','23.45','2018',2
) as a
ORDER BY a.Cust, a.rank
我知道我可以使用临时 table 和更新语句来完成此操作,但如果可能的话,我正在尝试找到一种在单个 select 语句中完成此操作的方法。
(如果有人想知道,这是针对 SSRS 报告的,但我认为这与此处无关。)
在 CASE 上尝试窗口聚合:
MIN(CASE WHEN [Year] = @RankBy THEN a.[rank] END)
OVER (PARTITION BY Cust)
我正在尝试获取 Top Customers 的结果集,该结果集按基于年份和总数的排名值排序。容易,对吧?
但是,现在我想指定年份,并为该客户提供所有行 return 那一年的排名值。
例如,假设我有以下数据(为便于排名硬编码):
SELECT * FROM
(
SELECT 'Customer A' as Cust,'123.45' as Total,'2016' as [year],1 as [rank]
UNION
SELECT 'Customer A','123.45','2017',3
UNION
SELECT 'Customer B','46.67','2016',2
UNION
SELECT 'Customer B','423.45','2017',1
UNION
SELECT 'Customer B','123.45','2018',1
UNION
SELECT 'Customer C','23.45','2016',3
UNION
SELECT 'Customer C','223.45','2017',2
UNION
SELECT 'Customer C','23.45','2018',2
) as a
ORDER BY a.[year], a.[rank]
如果我指定 2016 年,我想为每个客户选择 2016 年的排名值,return 为结果集中该客户的每一行选择该客户的排名值 - 应该看起来像以下:
我能处理的最接近的是以下内容,但它只是使其他单元格为空:
DECLARE @RankBy VARCHAR(4) = '2016'
SELECT [Year],
Cust,
[Total],
[rank] = (SELECT a.[rank] WHERE Cust = a.Cust AND [Year] = @RankBy)
FROM
(
SELECT 'Customer A' as Cust,'123.45' as Total,'2016' as [year],1 as [rank]
UNION
SELECT 'Customer A','123.45','2017',3
UNION
SELECT 'Customer B','46.67','2016',2
UNION
SELECT 'Customer B','423.45','2017',1
UNION
SELECT 'Customer B','123.45','2018',1
UNION
SELECT 'Customer C','23.45','2016',3
UNION
SELECT 'Customer C','223.45','2017',2
UNION
SELECT 'Customer C','23.45','2018',2
) as a
ORDER BY a.Cust, a.rank
我知道我可以使用临时 table 和更新语句来完成此操作,但如果可能的话,我正在尝试找到一种在单个 select 语句中完成此操作的方法。
(如果有人想知道,这是针对 SSRS 报告的,但我认为这与此处无关。)
在 CASE 上尝试窗口聚合:
MIN(CASE WHEN [Year] = @RankBy THEN a.[rank] END)
OVER (PARTITION BY Cust)