Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
多表选择查询中的SQL总计行_Sql_Sql Server_Sql Server 2012 - Fatal编程技术网

多表选择查询中的SQL总计行

多表选择查询中的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

我已经能够使用下面的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)

注意:我添加了对总值的格式化,以确保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列)来对行进行排序。