簡體   English   中英

SQL 多表 Select 查詢的總計行

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM