実は、そこにデータを保存することができ、さまざまな方法がありますが、唯一の違いは、あなたがそれを提示する方法です。
あなたの場合は、コード側でも設計できる行別の列にデータを表示する必要があります。
重要な点はデータの保存方法です。
このため、部門とその関連メッセージの異なるテーブルを "Department"と "DepartmentMessageDetails"とすることで、正規化された形式でデータを格納できます。
また、非正規化形式で1つのテーブルに格納することもできます。
レポート作成中。動的SQLスクリプトを使用して、ストアド・プロシージャを作成し、そこでテーブルを設計することができます。
サンプル:私はハードコーディングされたカラム名を使用していたが、我々は、私は後でスキップした動的なクエリを書く場合はこれも処理することができ、このサンプルで
DECLARE @Department TABLE
(
DNAM NVARCHAR(100),
DNO INT
)
INSERT INTO @Department
(DNAM, DNO)
VALUES (N'D1', 1),
(N'D2', 2),
(N'D3', 3)
DECLARE @Message TABLE
(
DNO INT,
[D1] NVARCHAR(100),
[D2] NVARCHAR(100),
[D3] NVARCHAR(100)
)
INSERT INTO @Message
(DNO, D1, D2, D3)
VALUES (1, N'T1_D1', N'T1_D2', N'T1_D3')--, (1, N'Test3 D2')
,(1, N'', N'Test1 D1', N'')
,(1, N'T1_D1', N'', N'')
,(1, N'', N'T1_D2', N'')
,(1, N'', N'', N'T1_D3')
,(1, N'', N'', N'T1_D3')
,(2, N'T2_D1', N'T2_D2', N'T2_D3')--, (2, N'Test3 D2')
,(2, N'T2_D1', N'', N'')
,(2, N'', N'T2_D2', N'')
,(2, N'', N'', N'T2_D3')
,(2, N'', N'', N'T2_D3')
,(2, N'', N'', N'T2_D3')
,(3, N'T3_D1', N'T3_D2', N'T3_D3')--, (3, N'Test3 D3')
,(3, N'T3_D1', N'', N'')
,(3, N'', N'T3_D2', N'')
,(3, N'', N'', N'T3_D3')
SELECT * FROM @Department
SELECT * FROM @Message
;WITH T AS
(
SELECT DISTINCT
(CASE WHEN DNO = 1 THEN 'D1'
WHEN DNO = 2 THEN 'D2'
WHEN DNO = 3 THEN 'D3'
END) AS Names
, DNO
FROM
@Message
)
SELECT
T1.Names ,
(CASE
WHEN T1.Names = 'D1' THEN -1
WHEN T1.Names = 'D2' THEN (SELECT COUNT(*) FROM @Message M WHERE (M.DNO = 1) AND (ISNULL(M.D2, '') <> ''))
ELSE (SELECT COUNT(*) FROM @Message M WHERE (M.DNO = 1) AND (ISNULL(M.D3, '') <> ''))
END) AS D1 ,
(CASE WHEN T1.Names = 'D2' THEN -1
WHEN T1.Names = 'D1' THEN (SELECT COUNT(*) FROM @Message M WHERE (M.DNO = 2) AND (ISNULL(M.D1, '') <> ''))
ELSE (SELECT COUNT(*) FROM @Message M WHERE (M.DNO = 2) AND (ISNULL(M.D3, '') <> ''))
END) AS D2 ,
(CASE WHEN T1.Names = 'D3' THEN -1
WHEN T1.Names = 'D2' THEN (SELECT COUNT(*) FROM @Message M WHERE (M.DNO = 3) AND (ISNULL(M.D2, '') <> ''))
ELSE (SELECT COUNT(*) FROM @Message M WHERE (M.DNO = 3) AND (ISNULL(M.D1, '') <> ''))
END) AS D3
FROM T T1
。
あなたの助けを借りていますが、SQLスクリプト – afreeman
について説明することができます。実際には、あなたの説明された条件に関して私の答えを更新し、サンプルを追加しました。 SQLスクリプトを報告するために、より良いオプションがあります。私は、単純なSQLスクリプトを使用するだけで、動的SQLを使用せずに同様のレポートを作成しました。これがあなたを助けることを願っています。 –