Используйте CTE и UNION ALL с SQL Server 2014 - PullRequest
0 голосов
/ 06 мая 2018

Моя проблема в том, что:

Создайте представление, которое показывает 5 лучших продаваемых продуктов, а также агрегированную строку, которая показывает общий объем продаж для всех других продуктов, и строку общего итога, которая суммирует все вышеперечисленное.

WITH ProductTop5 AS 
(
    SELECT [dbo].[Product].[ProductName] AS ProductName, SUM([dbo].[SalesOrderDetail].[LineTotal]) AS TotalAmount
    FROM [dbo].[Product]
    JOIN [dbo].[SalesOrderDetail] ON [dbo].[Product].[ProductID] = [dbo].[SalesOrderDetail].[ProductID]
    GROUP BY [dbo].[Product].[ProductName]  
)

enter image description here

1 Ответ

0 голосов
/ 06 мая 2018

Вы можете использовать ROW_NUMBER/RANK для расчета рейтинга товара:

WITH Product AS 
(
    SELECT p.[ProductName] AS ProductName,
           SUM(sod.[LineTotal]) AS TotalAmount
    FROM [dbo].[Product] p
    JOIN [dbo].[SalesOrderDetail] sod 
      ON p.[ProductID] = sod.[ProductID]
    GROUP BY p.[ProductName]  
), ProductWithRank AS (
    SELECT ProductName, Total_Amount,
           ROW_NUMBER() OVER(ORDER BY Total_Amount DESC) AS rn
    FROM Product
)
SELECT ProductName, TotalAmount
FROM ProductWithRank
WHERE rn <= 5
UNION ALL
SELECT 'All Others', SUM(Total_Amount)
FROM ProductWithRank
WHERE rn > 5
UNION ALL
SELECT 'Grand Total', SUM(TotalAmount)
FROM ProductWithRank;
...