显示前n个记录并合并其余行

use*_*309 3 sql sql-server sql-server-2005

我是编写SQL的新手.我有一个要求,我必须按原样显示前5条记录,并将其余记录合并为1条记录并将其作为第6条记录追加.我知道前5个选择前5个记录,但我发现很难将逻辑组合在一起以合并其余记录并将其附加到结果集的底部.

weekof          sales    year    weekno
-------------------------------------------------------------
07/01 - 07/07   2   2012    26  
07/08 - 07/14   2   2012    27  
07/29 - 08/04   1   2012    30  
08/05 - 08/11   1   2012    31  
08/12 - 08/18   32  2012    32  
08/26 - 09/01   2   2012    34  
09/02 - 09/08   8   2012    35  
09/09 - 09/15   46  2012    36   
09/16 - 09/22   26  2012    37
Run Code Online (Sandbox Code Playgroud)

我希望这个显示为

weekof          sales
----------------------
09/16 - 09/22   26  
09/09 - 09/15   46  
09/02 - 09/08   8   
08/26 - 09/01   2   
08/12 - 08/18   32  
07/01 - 08/11   6
Run Code Online (Sandbox Code Playgroud)

Aar*_*and 14

除了weekof跨越多年,这将获得您想要的数据以正确的顺序:

;WITH x AS 
(
  SELECT weekof, sales, 
    rn = ROW_NUMBER() OVER (ORDER BY [year] DESC, weekno DESC) 
  FROM dbo.table_name
)
SELECT weekof, sales FROM x WHERE rn <= 5
UNION ALL
SELECT MIN(LEFT(weekof, 5)) + ' - ' + MAX(RIGHT(weekof, 5)), SUM(sales)
FROM x WHERE rn > 5    
ORDER BY weekof DESC;
Run Code Online (Sandbox Code Playgroud)

当返回的行跨越一年时,您可能还必须返回rn(并且只在表示层忽略它):

;WITH x AS 
(
  SELECT weekof, sales, 
    rn = ROW_NUMBER() OVER (ORDER BY [year] DESC, weekno DESC) 
  FROM dbo.table_name
)
SELECT weekof, sales, rn FROM x WHERE rn <= 5
UNION ALL
SELECT MIN(LEFT(weekof, 5)) + ' - ' + MAX(RIGHT(weekof, 5)), SUM(sales), rn = 6 
FROM x WHERE rn > 5
ORDER BY rn;
Run Code Online (Sandbox Code Playgroud)