2017-04-12 17 views
0

レポートの目的で、返されたデータが特定の方法でグループ化されるようにストアドプロシージャを設定する際に問題があります。私は非契約部門の結果セットをグループ化し、非契約部門のグループごとに、からそれぞれ契約部門の関連データを表示します。特定の契約部門に対して行が存在しない場合は、依然として0の値で契約部門を表示したいと考えています。ストアドプロシージャからの結果セットのグループ化

参考までに、非契約部門には(B、D、E、F、G、H、 J、K、L、M、V)および契約部門には(C、O、T、NHQ、National)が含まれます。 IDパラメータを渡すことで目的のグループ分けを達成することができました。結果セットは単一の非契約部門のものでしたが、すべての非契約部門を適切なグループ分けで一度に返すことができる必要があります。

The result set should look similar to this

いくつかのDDLとテストデータ:

CREATE TABLE [dbo].[RcmpDivision] 
(
    [ID] [int] PRIMARY KEY IDENTITY(1,1) NOT NULL, 
    [DivisionName] [varchar](50) NOT NULL, 
    [IsContractDivision] [bit] NOT NULL 
) 

CREATE TABLE [dbo].[DivisionalTransaction] 
(
    [ID] [int] PRIMARY KEY IDENTITY(1,1) NOT NULL, 
    [FiscalYearID] [int] NOT NULL, 
    [ToDivisionID] [int] NOT NULL, 
    [FromDivisionID] [int] NOT NULL, 
    [IsRmCredit] [bit] NOT NULL 
) 

ALTER TABLE [dbo].[DivisionalTransaction] 
WITH CHECK ADD CONSTRAINT [FK_DivisionalTransaction_RcmpDivision] 
FOREIGN KEY([ToDivisionID]) REFERENCES [dbo].[RcmpDivision] ([ID]) 

ALTER TABLE [dbo].[DivisionalTransaction] CHECK CONSTRAINT [FK_DivisionalTransaction_RcmpDivision] 

ALTER TABLE [dbo].[DivisionalTransaction] 
WITH CHECK ADD CONSTRAINT [FK_DivisionalTransaction_RcmpDivision1] 
FOREIGN KEY([FromDivisionID]) REFERENCES [dbo].[RcmpDivision] ([ID]) 

ALTER TABLE [dbo].[DivisionalTransaction] CHECK CONSTRAINT [FK_DivisionalTransaction_RcmpDivision1] 

INSERT INTO [dbo].[RcmpDivision] 
     ([DivisionName], 
     [IsContractDivision]) 
VALUES 
('B',0),('C',1),('D',0),('E',0),('F',0),('G',0),('H',0),('J',0),('K',0), 
('L',0),('M',0),('National',1),('NHQ',1),('O',1),('T',1),('V',0) 

INSERT INTO [dbo].[DivisionalTransaction] 
     ([FiscalYearID] 
     ,[ToDivisionID] 
     ,[FromDivisionID] 
     ,[IsRmCredit]) 
VALUES 
(1,7,14,1),(1,4,14,1),(1,9,14,1),(1,7,14,1),(1,4,14,0),(1,7,12,1),(1,9,14,1),(1,3,4,0), 
(1,3,4,0),(1,4,14,1),(1,3,1,0),(1,3,12,0),(1,9,2,0),(1,7,2,1),(1,5,15,1),(1,9,16,0), 
(1,5,2,1),(1,10,13,1),(1,5,8,0),(1,5,13,1),(1,9,4,0),(1,1,2,1),(1,1,12,1),(1,1,12,1), 
(1,1,12,1),(1,1,15,1),(1,1,15,1) 
+0

を行くために良いことがありますあなたのアプリケーションコードの中で目的の結果を得るために – GurV

答えて

0

私はあなたの質問から確認されませんでしたが、私はあなたの非契約課レコードからID列が結ばれることを想定していますDivisionalTransactionテーブルのToDivisionID列(私はあなたの種データから知ることができる)に基づいています。

これに基づいて、すべての非契約部門を契約部門に参加させて、外部にDivisionalTransationを参加させ、次に合計集計関数を使用してカウントを生成します。

select ncd.DivisionName, cd.DivisionName, 
    sum(case when dt.ID is null then 0 else 1 end) as TotalCount 
from dbo.RcmpDivision as ncd 
cross join dbo.RcmpDivision as cd 
left outer join dbo.DivisionalTransaction as dt 
on dt.FromDivisionID = cd.ID 
    and dt.ToDivisionID = ncd.ID 
where cd.IsContractDivision = 1 
    and ncd.IsContractDivision = 0 
group by ncd.DivisionName, cd.DivisionName 
order by ncd.DivisionName, cd.DivisionName 

Here's the result from the given seed data

ちょうどあなたのストアドプロシージャにこのクエリを入れて、あなたが唯一のSQLを使用して、通常の結果セットを取得し、Dを処理しなければならない

+0

あなたはFKが正しいと仮定しており、あなたが提供したクエリはまさに私が探していたものです。すべてのあなたの助けをありがとう! – rudeboy

+0

DivisionalTransactionテーブルにはFiscalYearIDカラムがあります。** dt.FiscalYearID = 1 **をWHERE句に追加することによってデータをフィルタリングするためにクエリをわずかに変更すると、すべてのゼロ値が欠落しています(つまり、dt .IDはnullです)。なぜこれが起こるのか理解しようとしているのですか? – rudeboy

+1

LEFT OUTER JOINの最後に_and dt.FiscalYearID = 1_を追加しました。すべてうまくいきます – rudeboy

関連する問題