Чтобы получить строки промежуточных итогов, вам нужно несколько запросов или агрегирование на стороне клиента.С помощью нескольких запросов вы можете запросить хранилище данных несколько раз или поместить начальные данные во временную таблицу, а затем получить сводные данные.Ниже запрашивается несколько раз.Существует небольшой риск изменения данных между запросами.
-- Line details
SELECT
CONVERT(VARCHAR(12), SH.[Order Date], 107) AS [Posting Date]
,SH.[Salesperson] AS [Sales Staff]
,SH.[No_] AS [Document No]
,SH.[Customer No_] AS [Cust. No.]
,SH.[Customer Name] AS [Customer Name]
,SH.[Country] AS [Country]
,CONVERT(DECIMAL(10, 0), SL.[Quantity]) AS [Qty.]
,SL.[Unit of Measure] AS [UOM]
,SL.[No_] AS [Product No.]
,SL.[Description] AS [Product Description]
,CONVERT(DECIMAL(10, 2), SL.[Unit Price]) AS [Unit Price]
,SUM(CONVERT(DECIMAL(10, 2), SL.[Line Amount])) AS [Line Amt.]
,SH.[Currency] AS [Currency]
,'Detail' LineType
FROM [Sales Header] SH
INNER JOIN [Sales Line] SL ON SL.[Document No_] = SH.[No_]
WHERE SH.[Document Type] = '0'
OR SH.[Document Type] = '1'
AND SL.[Quantity] > '0'
GROUP BY
SH.[Order Date]
,SH.[Salesperson]
,SH.[No_]
,SH.[Customer No_]
,SH.[Customer Name]
,SH.[Country]
,SL.[Quantity]
,SL.[Unit of Measure]
,SL.[No_]
,SL.[Description]
,SL.[Unit Price]
,SH.[Currency]
UNION ALL
-- Order Summary
SELECT [Posting Date]
, [Sales Staff]
, [Document No]
, [Cust. No.]
, [Customer Name]
, [Country]
, NULL AS [Qty.] -- not needed is sub total line
, NULL AS [UOM] -- not needed is sub total line
, NULL AS [Product No.] -- not needed is sub total line
, NULL AS [Product Description] -- not needed is sub total line
, NULL AS [Unit Price] -- not needed is sub total line
, SUM(CONVERT(DECIMAL(10, 2), SL.[Line Amount])) OVER (PARTITION BY SH.[No_]) AS [Line Amt.] -- TotalAmountByOrder
, [Currency]
,'Order' LineType
FROM
(
SELECT
CONVERT(VARCHAR(12), SH.[Order Date], 107) AS [Posting Date]
,SH.[Salesperson] AS [Sales Staff]
,SH.[No_] AS [Document No]
,SH.[Customer No_] AS [Cust. No.]
,SH.[Customer Name] AS [Customer Name]
,SH.[Country] AS [Country]
,CONVERT(DECIMAL(10, 0), SL.[Quantity]) AS [Qty.]
,SL.[Unit of Measure] AS [UOM]
,SL.[No_] AS [Product No.]
,SL.[Description] AS [Product Description]
,CONVERT(DECIMAL(10, 2), SL.[Unit Price]) AS [Unit Price]
,SUM(CONVERT(DECIMAL(10, 2), SL.[Line Amount])) AS [Line Amt.]
,SH.[Currency] AS [Currency]
FROM [Sales Header] SH
INNER JOIN [Sales Line] SL ON SL.[Document No_] = SH.[No_]
WHERE SH.[Document Type] = '0'
OR SH.[Document Type] = '1'
AND SL.[Quantity] > '0'
GROUP BY
SH.[Order Date]
,SH.[Salesperson]
,SH.[No_]
,SH.[Customer No_]
,SH.[Customer Name]
,SH.[Country]
,SL.[Quantity]
,SL.[Unit of Measure]
,SL.[No_]
,SL.[Description]
,SL.[Unit Price]
,SH.[Currency]
) T
UNION ALL
-- Grand total
SELECT NULL AS [Posting Date]
, NULL AS [Sales Staff]
, NULL AS [Document No]
, NULL AS [Cust. No.]
, NULL AS [Customer Name]
, NULL AS [Country]
, NULL AS [Qty.] -- not needed is total line
, NULL AS [UOM] -- not needed is total line
, NULL AS [Product No.] -- not needed is total line
, NULL AS [Product Description] -- not needed is total line
, NULL AS [Unit Price] -- not needed is total line
, SUM(CONVERT(DECIMAL(10, 2), SL.[Line Amount])) OVER (PARTITION BY 1) AS [Line Amt.] -- TotalAmountAllOrders
, NULL AS [Currency] -- not needed is total line
, 'All' LineType
FROM [Sales Header] SH
INNER JOIN [Sales Line] SL ON SL.[Document No_] = SH.[No_]
WHERE SH.[Document Type] = '0'
OR SH.[Document Type] = '1'
AND SL.[Quantity] > '0'
Первоначальный ответ
Будет приятно увидеть примеры данных или структуру таблицы.Исходя из того, что у вас есть, мое лучшее предположение о том, чего вы пытаетесь достичь, приведено ниже.
SELECT
CONVERT(VARCHAR(12), SH.[Order Date], 107) AS [Posting Date]
,SH.[Salesperson] AS [Sales Staff]
,SH.[No_] AS [Document No]
,SH.[Customer No_] AS [Cust. No.]
,SH.[Customer Name] AS [Customer Name]
,SH.[Country] AS [Country]
,CONVERT(DECIMAL(10, 0), SL.[Quantity]) AS [Qty.]
,SL.[Unit of Measure] AS [UOM]
,SL.[No_] AS [Product No.]
,SL.[Description] AS [Product Description]
,CONVERT(DECIMAL(10, 2), SL.[Unit Price]) AS [Unit Price]
,SUM(CONVERT(DECIMAL(10, 2), SL.[Line Amount])) AS [Line Amt.]
,SH.[Currency] AS [Currency]
,SUM(CONVERT(DECIMAL(10, 2), SL.[Line Amount])) OVER (PARTITION BY SH.[No_]) TotalAmountByOrder
,SUM(CONVERT(DECIMAL(10, 2), SL.[Line Amount])) OVER (PARTITION BY SH.[Salesperson]) TotalAmountBySalesPerson
,SUM(CONVERT(DECIMAL(10, 2), SL.[Line Amount])) OVER (PARTITION BY SH.[Customer No_]) TotalAmountByCustomer
,SUM(CONVERT(DECIMAL(10, 2), SL.[Line Amount])) OVER (PARTITION BY 1) TotalAmounAllOrders
FROM [Sales Header] SH
INNER JOIN [Sales Line] SL ON SL.[Document No_] = SH.[No_]
WHERE SH.[Document Type] = '0'
OR SH.[Document Type] = '1'
AND SL.[Quantity] > '0'
GROUP BY
SH.[Order Date]
,SH.[Salesperson]
,SH.[No_]
,SH.[Customer No_]
,SH.[Customer Name]
,SH.[Country]
,SL.[Quantity]
,SL.[Unit of Measure]
,SL.[No_]
,SL.[Description]
,SL.[Unit Price]
,SH.[Currency]
Наличие, хотя и правильное в этой ситуации, в идеале относится к предложению where.Перемещая его в предложение where, мы больше не нуждаемся в группировке, и нам больше не нужно включать SH. [Document Type] в group by.
Изменение порядка расположения вашей группы.Сделал это только для сравнения всех столбцов в операторе выбора, чтобы убедиться, что ничего не пропущено
Добавлено несколько столбцов агрегации.Сумма для каждого заказа, для каждого продавца, для каждого клиента и итоговой суммы.Вы можете определить точную сумму, которая вам нужна, используя любой из этих примеров.