2

以下のデータを列Acct_Nameごとに合計し、フィールドごとにグループ化するときに、必要に応じてフィールドを保持するにはどうすればよいですか? 列の「Null」値は、アカウント名が追加されたときにグループ化用語で問題を引き起こします。アカウント C と D は両方とも で Null 値を持っています。句に追加すると、フィールドのみで値を合計する機能が失われます。AmountLine_NumLine_NumLine_NumAcct_Namegroup byLine_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_NameLine_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
4

1 に答える 1