如何在Acct_Name
列汇总下面的数据并按Amount
字段进行分组时,如何保留Line_Num
字段?添加帐户名称时,Line_Num
列中的“空”值会导致分组条款出现问题。帐户C和D都在Line_Num
中具有空值。如果我将Acct_Name
添加到group by
子句中,我将无法仅通过Line_Num
字段对值进行求和。
我试图根据行号对会计和组合进行汇总。空数据不是我做的,不幸的是它只是我交给的数据集。
原始数据:
Acct_Name ID Line_Num Amount
Acct A 1 1_01 100.0000
Acct A 1 1_01 -50.0000
Acct A 1 1_02 75.0000
Acct A 1 _02 125.0000
Acct B 2 2_01 200.0000
Acct B 2 2_01 50.0000
Acct B 2 2_02 25.0000
Acct C 3 3_01 75.0000
Acct C 3 3_02 50.0000
Acct C 3 3_03 -25.0000
Acct C 3 Null 65.0000
Acct D 4 Null 300.0000
Acct D 4 _02 100.0000
Acct D 4 Null -50.0000
Acct D 4 Null 75.0000
如果Line_Num
值为null,则允许该行与其他空值聚合。它将在报告中显示为下落不明,可以适当处理。
理想的处理数据集:
Amount Line_Num Acct_Name
390.00 Null Null
225.00 _02 Null
50.00 1_01 Acct A
75.00 1_02 Acct A
250.00 2_01 Acct B
25.00 2_02 Acct B
75.00 3_01 Acct C
50.00 3_02 Acct C
-25.00 3_03 Acct C
以下是我使用的以下查询:
Select SUM(Amount), Line_Num
FROM dbo.tblRawData
Group By Line_Num
此查询工作正常,但不包括任何聚合字段中的帐户名称。我需要在不包含空值的字段中使用帐户名称。
Select SUM(Amount), Line_Num, Acct_Name
FROM dbo.tblRawData
Group By Line_Num, Acct_Name
此查询包含帐户名称,但最终会根据“帐户名称”进行分组,而不仅仅是Line_Num。
Select *
From dbo.tblRawData a
Inner Join dbo.tblRawData b On (a.Line_Num = b.Line_Num)
(SELECT SUM(CAST(Amount as money)) as Amount, Line_Num
FROM dbo.tblRawData
GROUP BY Line_Num)
此内部联接意图仅加入在行号上等效的那些行,但我收到了一个笛卡尔结果集。显然我没有正确地写这个连接,或者我使用了错误的命令。
以下是可用于构建我正在使用的相同架构的查询:
CREATE TABLE [dbo].[tblRawData](
[Acct_Name] [nvarchar](50) NULL,
[ID] [nvarchar](50) NULL,
[Line_Num] [nvarchar] (50),
[Amount] [money]
) ON [PRIMARY]
GO
insert into dbo.tblRawData values ('Acct A', '1', '1_01', '100')
insert into dbo.tblRawData values ('Acct A', '1', '1_01', '-50')
insert into dbo.tblRawData values ('Acct A', '1', '1_02', '75')
insert into dbo.tblRawData values ('Acct A', '1', '_02', '125')
insert into dbo.tblRawData values ('Acct B', '2', '2_01', '200')
insert into dbo.tblRawData values ('Acct B', '2', '2_01', '50')
insert into dbo.tblRawData values ('Acct B', '2', '2_02', '25')
insert into dbo.tblRawData values ('Acct C', '3', '3_01', '75')
insert into dbo.tblRawData values ('Acct C', '3', '3_02', '50')
insert into dbo.tblRawData values ('Acct C', '3', '3_03', '-25')
insert into dbo.tblRawData values ('Acct C', '3', '', '65')
insert into dbo.tblRawData values ('Acct D', '4', '', '300')
insert into dbo.tblRawData values ('Acct D', '4', '_02', '100')
insert into dbo.tblRawData values ('Acct D', '4', '', '-50')
insert into dbo.tblRawData values ('Acct D', '4', '', '75')
P.S。 SQL Fiddle目前似乎无法访问(可能在我的结尾,不知道)
修改
如果看起来在尝试实现我的目标时存在明显的缺陷,请查看以下代码和喊叫器。如果Acct_Name
不匹配,我首选 Line_Item
保持为空,但也许我可以对此进行排序。
IF (SELECT object_id('TempDB..#temp4')) IS NOT NULL
BEGIN
DROP TABLE #temp4
END
SELECT SUM(CAST(Amount as money)) as Amount, Line_Num INTO #temp4
FROM dbo.tblRawData
GROUP BY Line_Num
Select * from #temp4
Select MAX(a.Acct_Name) as Acct_Name, MAX(b.Line_Num) as Line_Num, MAX(b.Amount) as Amount
From dbo.tblRawData a
Inner Join #temp4 b On (a.Line_Num = b.Line_Num)
Group By b.Line_Num
结果:
Acct_Name Line_Num Amount
Acct D Null 390.00
Acct D _02 225.00
Acct A 1_01 50.00
Acct A 1_02 75.00
Acct B 2_01 250.00
Acct B 2_02 25.00
Acct C 3_01 75.00
Acct C 3_02 50.00
Acct C 3_03 -25.00
答案 0 :(得分:2)
你走了:
;WITH CTE AS
(
SELECT Line_Num,
SUM(Amount) Amount,
MIN(Acct_Name) MinAcct_Name,
MAX(Acct_Name) MaxAcct_Name
FROM tblRawData
GROUP BY Line_Num
)
SELECT Amount,
Line_Num,
CASE WHEN Line_Num IS NULL
OR MinAcct_Name <> MaxAcct_Name THEN NULL
ELSE MinAcct_Name END Acct_Name
FROM CTE