Топ 10 записей с суммой оставшихся записей в других на сервере SQL - PullRequest
0 голосов
/ 27 мая 2019

У меня есть одна таблица, которая состоит из 4 столбцов - (id int, location varchar (max), [date] datetime, Total_Sales Money), которые состоят из 20 записей в выводе. Я хочу 11 строк, в которых первые 10 строк, как это и 11-я строка должна быть суммой оставшихся строк, то есть от 11 до 20 в Other_Location. Пожалуйста, помогите мне получить запрос.

Я хочу 11 строк, в которых первые 10 строк должны быть как есть, а 11-я строка должна быть суммой оставшихся строк

Ответы [ 3 ]

1 голос
/ 27 мая 2019

В SQL Server 2012, используя оконную функцию ROW_NUMBER(), вы можете достичь этого.Создайте ROW_NUMBER() для установки RowNum для каждой строки и на основе результата, используя UNION ALL, он вернет результат:

;WITH CTE AS (
    SELECT id, location, [date], Total_Sales,
           ROW_NUMBER() OVER (ORDER BY Id) AS RowNum
    FROM TableName
)

SELECT CAST(id AS VARCHAR(30)) AS Id,
       location, 
       CAST([date] AS VARCHAR(30)) AS [date], 
       CAST(Total_Sales AS VARCHAR(30)) AS Total_Sales 
FROM CTE 
WHERE RowNum BETWEEN 1 AND 10
UNION 
SELECT '11-20 ids' AS id, 
       '11-20 AS locations' as location, 
       '11-20 dates' AS [date], 
       SUM(Total_Sales) AS Total_Sales 
FROM CTE 
WHERE RowNum BETWEEN 11 AND 20

Демонстрация на db <> fiddle

1 голос
/ 27 мая 2019

Вы можете выбрать 10 лучших строк и сумму 1 строки с помощью union

Может быть код:

SELECT id, location, date, total_sales FROM table limit 10 // where etc..
UNION
SELECT 0 as id, '' as location, 0 as date, sum(total_sales) as total_sales FROM table;
0 голосов
/ 27 мая 2019

Я бы использовал row_number() и условную агрегацию.Таким образом, вы можете сделать это с одним group by:

select (case when seqnum <= 10 then id end) as id,
       max(case when seqnum <= 10 then location else 'All else' end) as location,
       max(case when seqnum <= 10 then datetime end) as datetime,
       sum(amount)
from (select t.*,
             row_number() over (order by amount desc) as seqnum
      from t
     ) t
group by (case when seqnum <= 10 then id end);
...