多表选择查询中的SQL总计行
我已经能够使用下面的SQL查询为我提供4行数据多表选择查询中的SQL总计行,sql,sql-server,sql-server-2012,Sql,Sql Server,Sql Server 2012,我已经能够使用下面的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
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)
注意:我添加了对总值的格式化,以确保NetAmount和MarginAmount的总值与细分值共享相同的数据类型。考虑删除查询中的值并将其添加到应用程序的演示文稿层。 与一个分组进行分组可能只是其中的诀窍。
简化示例片段:
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
返回:
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
您使用的是什么RDBMS?您好,这是使用MS SQL Server 2012,您可以将其添加到一个临时表中以保存四行,并将四行结果计算到最后一行。然后,您可以返回临时表并查看分组集。。。例如,嗨,约翰,这给了我我需要的东西,谢谢。只需要在类型栏中添加一个名字(即总计),但似乎找不到一种方法来做这件事。嗨,Pilosa,这几乎给了我我所需要的,但是因为这是按类型分类的,所以总行在中间。您知道如何按照与我查询中的选择相同的方式对其进行排序。您可以添加一列(请参阅我更新的答案中的a列)来对行进行排序。