ВЫБЕРИТЕ запрос с итогом внизу

#sql #sql-server #tsql

#sql #sql-сервер #tsql

Вопрос:

У меня есть таблица в SQL Server 2012. Следующий запрос отлично работает:

 SELECT TOP 300 [ObjectID], [tbh_Objects].Title, [Quantity], [tbh_Section].Title
FROM [ECom].[dbo].[tbh_Objects] 
INNER JOIN [tbh_Section] ON tbh_Objects.SectionID = tbh_Section.SectionID 
ORDER BY tbh_Objects.AddedDate DESC
  

Я просто хочу сделать итог в конце столбца количества, сохраняя тот же запрос. Я читал о группе по свертке, но, похоже, я не могу понять это.

Кто-нибудь может помочь, пожалуйста?

Комментарии:

1. Вы хотите, чтобы количество было в отдельной строке или в отдельном столбце? Вам нужно значение только для 300 строк или для всех данных?

2. Вам действительно нужно добавить сюда образцы входных и выходных данных. Мы не можем читать ваши мысли.

3. @GordonLinoff Я хочу общую сумму внизу столбца количества. Он должен суммировать количество всех 300 строк.

Ответ №1:

Боюсь, ГРУППИРОВКА ПО и СВЕРТКА не совсем так работают.

То, что вы просите, было бы тривиальным в Excel, но для получения итога в конце SQL необходимо СУММИРОВАТЬ, а для суммирования необходимо удалить все повторяющиеся строки, которые являются частью группы, следовательно, GROUP BY . Однако это противоречит тому, что вы хотите, а именно балансу в конце при сохранении всех отдельных строк.

Что-то вроде приведенного ниже будет работать без оконных функций, просто чтобы дать вам представление. Однако он не будет масштабироваться очень хорошо, так что это больше похоже на быстрое исправление. Даже для этого можно использовать другой столбец, чтобы гарантировать, что итоговое значение всегда идет снизу. Чем больше это становится, либо по количеству строк, либо по количеству промежуточных итогов, тем скорее я бы предложил перейти к оконным функциям и объединить различные итоги в конце или отобразить в приложении / отчете.

 WITH cteIndividualLines AS
(
    SELECT TOP 300 [ObjectID], [tbh_Objects].Title, [Quantity], [tbh_Section].Title
    FROM [ECom].[dbo].[tbh_Objects] 
    INNER JOIN [tbh_Section] ON tbh_Objects.SectionID = tbh_Section.SectionID 
    ORDER BY tbh_Objects.AddedDate DESC
),
cteGrandTotal AS
(
    SELECT
        GrandTotal = SUM(Quantity)
    FROM
        cteIndividualLines
)
SELECT
     ObjectID
    ,Title
    ,Quantity
    ,Title
FROM
    cteIndividualLines


UNION ALL


SELECT
     NULL
    ,'Grand Total'
    ,GrandTotal
    ,NULL
FROM
     cteGrandTotal  
  

Ответ №2:

Это должно сработать -> Sum с вашим подробным запросом с использованием оконной функции для свертки.

 SELECT TOP 300 [ObjectID], [tbh_Objects].Title, [Quantity], [tbh_Section].Title,
SumQuantity = SUM([Quantity]) OVER (PARTITION BY ObjectID)   
FROM [ECom].[dbo].[tbh_Objects] 
INNER JOIN [tbh_Section] ON tbh_Objects.SectionID = tbh_Section.SectionID 
ORDER BY tbh_Objects.AddedDate DESC
  

Если вам нужно, чтобы значения совпадали с тем, что находится ВВЕРХУ, тогда этот запрос должен сработать.

 ;WITH A AS
(
    SELECT [ObjectID], [tbh_Objects].Title, [Quantity], [tbh_Section].Title, 
    TopValue= ROW_NUMBER() OVER(ORDER BY tbh_Objects.AddedDate)
    FROM [ECom].[dbo].[tbh_Objects] 
    INNER JOIN [tbh_Section] ON tbh_Objects.SectionID = tbh_Section.SectionID
 ) 
 SELECT 
     *,
      SumQuantity = SUM([Quantity]) OVER (PARTITION BY ObjectID) 
 FROM
     A
WHERE
    TopValue <= 300
  

Комментарии:

1. Функция window будет работать независимо от выбора TOP (X), если это приемлемо.

2. Спасибо. Я хочу общую сумму в нижней части столбца количества. Всего одна строка, суммирующая количество всех 300 строк.