[英]SQL Grand Total row from Multi table Select Query
我已經能夠使用下面的 SQL 查詢給我 4 行數據
SELECT 'Sales Order ' as Type, Format(Sum(T1.C_NetAmountLessDiscount),
'#.00') As NetAmount, Format(Sum(T1.C_MarginAmount), '#.00') As
MarginAmount, Format(Sum(T1.C_MarginAmount)/Sum(T1.C_NetAmountLessDiscount),
'#.00%') As Margin
From T_SalesOrder as T1
Where cast(T1.C_Date as Date) = cast(getdate() as Date) AND T1.C_OrderType
!= 'BK' AND T1.C_OrderType != 'INV'
Union
SELECT 'Despatch Notes ' AS Type, Format(Sum(T1.C_NetAmountLessDiscount),
'#.00') As NetAmount, Format(Sum(T1.C_MarginAmount), '#.00') As
MarginAmount, Format(Sum(T1.C_MarginAmount)/Sum(T1.C_NetAmountLessDiscount),
'#.00%') As Margin
From T_SalesDeliveryNote as T1
Where cast(T1.C_Date as Date) = cast(getdate() as Date) AND T1.C_Order is
null AND T1.C_BillingStatus = '0'
Union
SELECT 'Invoices ' AS Type, Format(Sum(T1.C_NetAmountLessDiscount), '#.00')
As NetAmount, Format(Sum(T1.C_MarginAmount), '#.00') As MarginAmount,
Format(Sum(T1.C_MarginAmount)/Sum(T1.C_NetAmountLessDiscount), '#.00%') As
Margin
From T_SalesInvoice as T1
Where cast(T1.C_Date as Date) = cast(getdate() as Date) And
T1.C_DeliveryNote is null And T1.C_SourceOrder is null and T1.C_InvoiceType
= '0'
Union
SELECT 'Credit Notes ' AS Type, Format(Sum(T1.C_NetAmountLessDiscount), '-
#.00') As NetAmount, Format(Sum(T1.C_MarginAmount), '-#.00') As
MarginAmount, Format(Sum(T1.C_MarginAmount)/Sum(T1.C_NetAmountLessDiscount),
'#.00%') As Margin
From T_SalesCreditNote as T1
Where cast(T1.C_Date as Date) = cast(getdate() as Date)
這使我可以根據需要對訂單進行細分,但我還希望有一個總計行來對每一列求和。
如果我將上面的 sql 查詢插入到下面
Select 'Grand Total', Sum(CAST(NetAmount AS float)), Sum(CAST(MarginAmount
AS float)),null
From
(
-----Above SQL Query in Here
)tbl
我得到一個包含正確總數但沒有細分行的單行。
我該怎么做才能顯示每種類型的四行和底部的總計行。
使用公用表表達式(CTE)。
WITH t AS(
-- Your query goes here
-- SELECT 1 AS A, 'Sales Order' ...
-- UNION SELECT 2 AS A, 'Despatch Notes' ...
-- UNION SELECT 3 AS A, 'Invoices' ...
-- UNION SELECT 4 AS A, 'Credit Notes' ...
)
SELECT
A,
Type,
NetAmount,
MarginAmount,
Margin
FROM
t
UNION SELECT
5 AS A,
'Grand Total' AS Type,
FORMAT(SUM(CAST(NetAmount AS FLOAT)), '#.00') As NetAmount,
FORMAT(SUM(CAST(MarginAmount AS FLOAT)), '#.00') As MarginAmount,
NULL
FROM
t
ORDER BY
A
注意:我添加了總值的格式,以確保 NetAmount 和 MarginAmount 的總值與細分值共享相同的數據類型。 考慮從查詢中刪除值的格式並將其添加到應用程序的表示層。
使用ROLLUP進行分組可能只是解決此問題的訣竅。
簡化示例片段:
DECLARE @Table1 TABLE (
ID INT IDENTITY(1,1) PRIMARY KEY,
Name VARCHAR(30) NOT NULL,
NetAmount DECIMAL(10,2) NOT NULL DEFAULT 0
);
DECLARE @Table2 TABLE (
ID INT IDENTITY(1,1) PRIMARY KEY,
Name VARCHAR(30) NOT NULL,
NetAmount DECIMAL(10,2) NOT NULL DEFAULT 0
);
INSERT INTO @Table1 (Name, NetAmount)
VALUES ('A', 4.1), ('A', 6.1);
INSERT INTO @Table2 (Name, NetAmount)
VALUES ('B', 9.1), ('B', 11.1);
WITH CTE_AMOUNTS AS
(
SELECT 'T1' as [Type],
SUM(NetAmount) AS [NetAmount]
FROM @Table1
UNION ALL
SELECT 'T2', SUM(NetAmount)
FROM @Table2
)
SELECT
COALESCE([Type], 'Grand Total') AS [Type],
SUM([NetAmount]) AS [NetAmount]
FROM CTE_AMOUNTS
GROUP BY Type WITH ROLLUP
ORDER BY GROUPING_ID(Type), Type;
回報:
Type NetAmount
T1 10,20
T2 20,20
Grand Total 30,40
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.