以下のデータを列Acct_Name
ごとに合計し、フィールドごとにグループ化するときに、必要に応じてフィールドを保持するにはどうすればよいですか? 列の「Null」値は、アカウント名が追加されたときにグループ化用語で問題を引き起こします。アカウント C と D は両方とも で Null 値を持っています。句に追加すると、フィールドのみで値を合計する機能が失われます。Amount
Line_Num
Line_Num
Line_Num
Acct_Name
group by
Line_Num
行番号に基づいて会計とグループの行を合計しようとしています。null データは私が行ったものではありません。残念ながら、それは私が渡された単なるデータ セットです。
元のデータ:
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
値が nullの場合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
このクエリは正常に機能しますが、集計されたフィールドのいずれにもアカウント名が含まれていません。null 値を含まないフィールドにアカウント名が必要です。
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)
この内部結合は、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')
PS SQL Fiddle は現在アクセスできないようです (私の側にいる可能性があります。わかりません)。
編集
次のコードを見て、私の目標を達成しようとする際に明らかな欠陥があると思われる場合は大声で叫んでください。一致しない場合は null のままにしたいのですが、おそらくそれを整理できます。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